Angular 6中的强类型SignalR集线器

时间:2018-08-19 20:16:38

标签: c# angular typescript asp.net-core-signalr

太长;没看: 如何在Angular 6中实现强类型的SignalR集线器(自定义方法)?


最终,我正在尝试通过服务和接口在Angular 6中使用强类型SignalR集线器。我先从集线器开始。由于SignalR现在可以选择使用强类型命令,因此我想使用它们来更好地保护数据。我不介意也有一种方法可以进行身份​​验证,但这可能是另一个时代的故事。

ApHub.cs

using System.Threading.Tasks;
using AckermanPuglisi.Thesaurus;
using Microsoft.AspNetCore.SignalR;

namespace Tinhalo.Hubs {
    public class ApHub : Hub<INlgClient> {
        private readonly IApContext _apContext;

        public ApHub(IApContext apContext) {
            _apContext = apContext;
        }

        public async Task GetTraits() {
            await Clients.Caller.GetAllTraits(_apContext.Traits);
        }

        public async Task GetEmotions() {
            await Clients.Caller.GetAllEmotions(_apContext.Emotions);
        }

        public async Task ConnectionMessage() {
            await Clients.Caller.CheckConnection("You are connected");
        }
    }
}

从那里,我创建SignalR的接口,使其具有在Angular中需要调用的类型化方法。我已经在models文件夹中制作了模型,但是我将省略有关细节,因为我不确定它们是否相关。

INlgClient.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AckermanPuglisi.Thesaurus.Data.Graph.Models;

namespace Tinhalo.Hubs {
    public interface INlgClient {
        Task GetAllTraits(ICharacterTrait[] apContextTraits);
        Task GetTrait(ICharacterTrait trait);
        Task GetAllEmotions(Emotion[] apContextEmotions);
        Task GetEmotion(Emotion emotion);   
        Task GetTraitEmotions(string traitName);
        Task CheckConnection(string connectMessage);
    }
}

前两件事在未键入时可以肯定地起作用。之后,我在Angular 6中做了一些事情,即服务(我发现只有在定义window之后才能启动hub连接),否则会得到XMLHttpRequest未定义错误)

signal.service.ts

import { Injectable, Inject, OnInit, AfterViewInit } from '@angular/core';
import { HubConnection, HubConnectionBuilder, JsonHubProtocol } from "@aspnet/signalr";
import { Emotion } from '../models/emotion.model';
import { Trait } from '../models/trait.model';
import * as signalr from '@aspnet/signalr';
import { Subject } from 'rxjs';

@Injectable({
    providedIn: "root"
})
export class SignalService {
    public aphub: HubConnection;

    public hubConnected: any;

    constructor(@Inject('BASE_URL') baseUrl: string) {
        let options = {
            transport: signalr.HttpTransportType.WebSockets
                | signalr.HttpTransportType.LongPolling,
            AccessTokenFactory: async () => {
                // Get and return the access token.
                // This function can return a JavaScript Promise if asynchronous
                // logic is required to retrieve the access token.
            }
        };
        let protocol = new signalr.JsonHubProtocol();

        this.aphub = new signalr.HubConnectionBuilder()
            .configureLogging(signalr.LogLevel.Trace)
            .withUrl(`${baseUrl}aphub`, options)
            .withHubProtocol(protocol).build();
    }
}

现在,如果我执行this.aphub.getTraits((traits) => { ... });等效于hub.invoke('getTraits' ... ),它会说该方法在设计时尚未定义,但会在运行时显示在检查中。这告诉我,我完全需要一个接口-我已经有了它。我认为最大的问题是我可能可以在新类上实现自定义方法,但是由于私有/内部内容与SignalR HubConnections的混合使用,我不知道必须自定义实现什么。

我什至没有实现正确的对象。

aphub.interface.ts

import { HubConnection } from "@aspnet/signalr";

interface IAphub extends HubConnection {
    getTraits(): void;
    getTrait(traitName: string): void;
    getTraitEmotions(traitName: string): void;
    getEmotions(): void;
    getEmotion(emotionName: string): void;
    connectionMessage(): void;
}

class ApHub implements IAphub {
  /* What goes here? */
}

请客气,我对Angular本身还很陌生,但是我绝对可以使用它的C#部分。我已经在MVC中工作了一段时间-Typescript对我来说有点新,但是我了解了大部分。 SignalR似乎是处理异步数据的最佳方法,因为它不仅具有.Caller,而且还有.Broadcast,它将在稍后的发布中派上用场。

Google在Angular上有很多东西,但是有Angular 1.x,Angular 2.x和所有版本控制方面的混淆(ng-thing与ng2-thing与ngx-thing以及带有{{ }}和$,以及充满了Angular 4.x代码的垃圾车),我只想为我的AspNetCore 2.1(将是3.0),SignalR @ latest和Angular 6网站找到答案。


我试图使用SignalR.exe生成一个接口,但是说缺少一个清单是行不通的-这很可能是因为它是一个dotnet核心应用程序。

1 个答案:

答案 0 :(得分:1)

我不知道是否能为您提供帮助,但是我已经在angular6中创建了一个样板以与signalR一起使用。

您可以尝试理解存储库中的代码,我试图使其变得更简单。

随意克隆或询问

FrontEnd

BackEnd

  

在启动前端之前,您需要遵循以下命令:

     
      
  • npm安装
  •   
  • npm install @ angular / cli
  •   
     

要运行项目,只需键入:

     
      
  • ng服务
  •   
     

要启动后端,您需要遵循以下命令:

     
      
  • dotnet恢复
  •   
  • dotnet监视运行
  •   

我想我得到了您想要的,我想您想将方法映射到前端的集线器(后)中,对吗?