【问题标题】:SignalR separated events for multiple hubsSignalR 分隔多个集线器的事件
【发布时间】:2013-11-23 16:05:22
【问题描述】:

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

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

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

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

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

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

任何对 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)
});

【问题讨论】:

  • 仍在寻找答案,如果有人知道

标签: c# .net signalr signalr-hub


【解决方案1】:

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

解决方案相当简单,注册一个no-op客户端方法就足够了:

$(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 组无法提供的东西,因为它们不可枚举)是相当的对于您无法收回的连接毫无用处,所以这是我为什么必须这样做的两分钱。

【讨论】:

  • 注意正确的语法是:$.connection.chatHub.client.noop = function () { };,所以你需要在集线器的客户端属性上设置noop方法
猜你喜欢
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多