ABP中的多个SignalR连接

时间:2018-02-21 03:25:48

标签: angular typescript asp.net-core signalr aspnetboilerplate

我有一个使用ASP.NET Zero模板的项目。我已成功将SignalR集成到我的解决方案中,实时通知工作正常。我想要的是在我的解决方案中添加另一个集线器或扩展现有的SignalR集线器以向其添加更多内容。

SignalR AspNetCore Integration文档中,它说要将以下内容添加到 Startup.cs 文件中:

app.UseSignalR(routes =>
{
     routes.MapHub<AbpCommonHub>("/signalr"); // default hub
     routes.MapHub<HitchNotification.HitchHub>("/hitchHub"); // my hub
});

然而,问题是我需要设置连接的客户端!在 SignalRAspNetCoreHelper.ts 中,它将URL设置为使用'/signalr'集线器(默认值为1)。

export class SignalRAspNetCoreHelper {
    static initSignalR(): void {

        var encryptedAuthToken = new UtilsService().getCookieValue(AppConsts.authorization.encrptedAuthTokenName);

        abp.signalr = {
            autoConnect: true,
            connect: undefined,
            hubs: undefined,
            qs: AppConsts.authorization.encrptedAuthTokenName + "=" + encodeURIComponent(encryptedAuthToken),
            url: AppConsts.remoteServiceBaseUrl + '/signalr'
        };

        jQuery.getScript(AppConsts.appBaseUrl + '/assets/abp/abp.signalr-client.js');
    }
}

如果我将'/signalr'更改为'/hitchHub',则可以正常使用。但我想在我的申请中都有!我尝试为自己的集线器创建一个类似于 SignalRAspNetCoreHelper.ts 的帮助器,并在 app.component.ts 中初始化它:

ngOnInit(): void {
    if (this.appSession.application && this.appSession.application.features['SignalR']) {
        if (this.appSession.application.features['SignalR.AspNetCore']) {
            SignalRAspNetCoreHelper.initSignalR();
            HitchHubHelper.initHitchHub();  
        } 
    }
}

但似乎abp.signalr无法与不同的集线器建立多个连接。

所以,基本上我有两个问题:

  1. 有什么方法可以将我自己的集线器功能添加到默认AbpCommonHub?这样,我可以简单地修改 abp.signalr-client.js 文件。

  2. 如果上述情况不可能,我如何在abp.signalr上设置多个集线器,以便在我的应用程序中随处访问?

1 个答案:

答案 0 :(得分:0)

  
      
  1. 有没有办法可以将我自己的集线器功能添加到现有的默认AbpCommonHub中?这样我就可以简单地修改abp.signalr-client文件
  2.   

不确定。继承AbpCommonHub

public class HitchHub: AbpCommonHub
{
    // Ctor omitted for brevity

    public async Task SendMessage(string message)
    {
        await Clients.All.SendAsync("getMessage", string.Format("User {0}: {1}", AbpSession.UserId, message));
    }
}

替换中心:

// routes.MapHub<AbpCommonHub>("/signalr");
routes.MapHub<HitchHub>("/signalr");
  
      
  1. 如果上述情况不可能,我怎样才能在我的应用程序中的任何位置访问abp.signalr上的多个集线器?
  2.   

上述情况并非不可能,但无论如何我都会回答这个问题来演示多个集线器(对于Angular)。

继承AbpHubBase

public class HitchHub : AbpHubBase, ITransientDependency
{
    public async Task SendMessage(string message)
    {
        await Clients.All.SendAsync("getMessage", string.Format("User {0}: {1}", AbpSession.UserId, message));
    }
}

地图中心:

routes.MapHub<AbpCommonHub>("/signalr"); // No change
routes.MapHub<HitchHub>("/signalr-hitchHub"); // Prefix with '/signalr'

用法

这需要Abp.AspNetCore.SignalR v3.5.0-preview3

修改 SignalRAspNetCoreHelper.ts

abp.signalr = {
    autoConnect: true,  // No change
    connect: undefined, // No change
    hubs: undefined,    // No change
    qs: AppConsts.authorization.encrptedAuthTokenName + "=" + ... // No change
    remoteServiceBaseUrl: AppConsts.remoteServiceBaseUrl,         // Add this
    startConnection: undefined,                                   // Add this
    url: '/signalr' // Changed from: AppConsts.remoteServiceBaseUrl + '/signalr'
};

// Modify the following block
jQuery.getScript(AppConsts.appBaseUrl + '/assets/abp/abp.signalr-client.js', () => {
    var hitchHub;

    abp.signalr.startConnection('/signalr-hitchHub', function (connection) {
        hitchHub = connection; // Save a reference to the hub

        connection.on('getMessage', function (message) { // Register for incoming messages
            console.log('received message: ' + message);
        });
    }).then(function (connection) {
        abp.log.debug('Connected to hitchHub server!');
        abp.event.trigger('hitchHub.connected');
    });

    abp.event.on('hitchHub.connected', function() { // Register for connect event
        hitchHub.invoke('sendMessage', "Hi everybody, I'm connected to the chat!"); // Send a message to the server
    });
});