代码之家  ›  专栏  ›  技术社区  ›  Mohammad Shadmehr

ABP中的多个信号机连接

  •  2
  • Mohammad Shadmehr  · 技术社区  · 8 年前

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

    SignalR AspNetCore Integration 文档,它表示要将以下内容添加到 启动。反恐精英 文件:

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

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

    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');
        }
    }
    

    如果我更改 “/信号器” '/hitchHub' ,工作正常。但我想在我的应用程序中两者都要!我尝试为自己的中心创建一个类似于 SignalASPNetCoreHelper。ts 并在 应用程序。组成部分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。信号器客户端。js公司 文件

    2. 如果无法实现上述功能,如何在 abp。信号机 在我的应用程序中的任何位置都可以访问?

    1 回复  |  直到 8 年前
        1
  •  2
  •   aaron    8 年前
    1. 是否有任何方法可以将自己的hub功能添加到现有的默认AbpCommonHub中?这样我就可以简单地修改abp。信号器客户端文件

    当然继承 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上拥有多个集线器。信号器是否可以在我的应用程序中的任何位置访问?

    以上并非不可能,但我将回答这个问题,以演示多个轮毂(用于角度)。

    继承 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 .

    修改 SignalASPNetCoreHelper。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
        });
    });
    
    推荐文章