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

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

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

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

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

我遇到的问题是,尽管两个集线器类都实现了自己版本的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)

2 years ago

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

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

$(function()
{
  // A no-op client method so the hub's
  // OnConnected, OnReconnected and OnDisconnected method overloads are triggered.
  $.connection.chatHub.client.noop = function () { };
  $.connection.hub.start()
    .done(function() { console.log("SignalR connection is up and running."); })
    .fail(function(error) { console.log(error); });
});

我不知道进入这个的确切原因,但是通常用于跟踪连接客户端并且可能将它们与抽象相关联的重载(SignalR组无法提供的东西,因为它们不可枚举)对于你无法回头的联系,所以这就是为什么必须以这种方式完成的两分钱 .