3

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

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

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

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

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

我不知道这是设计使然,还是我做错了什么。到目前为止,我已经阅读了一些文章和答案,指出与集线器服务器的连接是单个连接,并且我没有连接到特定的集线器,我作为一个整体连接到集线器服务器,因此只有一种方法将永远被识别和调用。

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

我将在下面放一些代码以更好地说明该场景,但如果您需要查看更多代码,请询问,我会添加它。

状态中心.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();
    }
}

聊天中心.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)
});
4

1 回答 1

2

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

解决方案相当简单,注册一个这样的无操作客户端方法就足够了:

$(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 组无法提供,因为它们不可枚举)对于您无法收回的连接,所以这就是我为什么必须以这种方式完成的两分钱。

于 2014-10-24T21:19:57.100 回答