SignalR为多个集线器分离了事件

时间:2013-11-11 18:36:19

标签: c# .net signalr signalr-hub

我正在尝试为它们设置一些SignalR Hub和一些单独的OnDisconnected事件。

为了这个问题,在某些页面上我有两个Hub:

  1. StatusHub:处理网站上用户的状态。该中心的方法在网站的每个页面上调用,并且具有用户连接和断开连接的逻辑,以便在浏览WebSite时更新用户状态。

  2. ChatHub:处理与网站实时聊天相关的所有内容。当用户点击特定按钮时,此集线器的方法仅从网站的特定页面调用。

  3. 我遇到的问题是,即使两个集线器类都实现了自己版本的OnConnected和OnDisconnected方法,但只触发了StatusHub方法,而且没有调用ChatHub方法。

    我不知道这是不是设计,或者我做错了什么。到目前为止,我已经阅读了一些文章和答案,其中指出与中心服务器的连接是单个连接,并且我没有连接到特定的集线器,我连接到Hub服务器作为一个整体因此只有一个方法将被承认并被召唤。

    任何对SignalR有更多经验的人都可以告诉我是否有办法分离两个集线器的连接和断开事件,或者这是否真的意味着这样?

    我将在下面添加一些代码来更好地说明这种情况,但是如果你需要查看更多代码,只需要询问,我就会添加它。

    StatusHub.cs

    public class StatusHub : Hub { 
        public override Task OnDisconnected()
        {
            //handles the disconnected event as needed
            return base.OnDisconnected();
        }
    
    
        public override Task OnConnected()
        {
            //handles the connected event as needed
            return base.OnConnected();
        }
    }
    

    ChatHub.cs

    public class ChatHub : Hub { 
        public override Task OnDisconnected()
        {
            //should handle the chat disconnected event but is never reached
            return base.OnDisconnected();
        }
    
    
        public override Task OnConnected()
        {
            //should handle the chat connected event but is never reached
            return base.OnConnected();
        }
    }
    

    启动中心服务器连接的代码(在每个页面上执行):

    $.connection.hub.start().done(function() {
        //a lot of code here (irrelevant to the question I think)
    });
    

1 个答案:

答案 0 :(得分:2)

你解决了吗?您所描述的内容似乎是一个没有为ChatHub注册任何客户端方法的问题。当没有注册客户端方法时,客户端可以在服务器上调用hub方法,并获得结果(非常类似于无状态协议的请求 - 响应性质),但是因为服务器无法调用任何内容客户端没有被要求提供响应(通过客户端调用集线器方法),设计上这样的连接不会触发OnConnectedOnReconnected和{{1}重载。

解决方案非常简单,只需注册这样的无操作客户端方法即可:

OnDisconnected

我不知道进入此的确切推理,但是过载,通常用于跟踪连接的客户端并可能将它们与抽象相关联(SignalR组无法提供,因为它们不可枚举)对于你无法回头的联系来说,这是非常无用的,所以我必须以这种方式完成为什么要这样做。