【问题标题】:Signalr server side, OnDisconnect only called for 1 hubSignalr 服务器端,OnDisconnect 仅调用 1 个集线器
【发布时间】:2014-09-04 08:16:27
【问题描述】:

我正在编写一个使用 SignalR 的 Web 应用程序。在服务器 c# 上,我有两个集线器。 它确实需要是两个,否则我只会合并它们并解决问题。

我遇到的问题是,虽然我知道 SignalR 客户端,集线器 将共享连接。我遇到的问题是,当我关闭浏览器或在客户端上调用 stop 时。我的服务器端 OnDisconnect(bool stopCalled) 事件中只有 1 个会触发。

我以某种方式期望当客户端断开连接时两者都会触发。

我是傻还是做错了什么? 任何信息将不胜感激。

路易

【问题讨论】:

  • 根据文档 (asp.net/signalr/overview/signalr-20/hubs-api/…) 在某些情况下可能不会调用 OnDisconnected。如果不知道您想如何/想做什么的更多详细信息,当客户端断开连接时,将很难为您提供帮助。如果您确实需要同时从客户端到服务器的“2个连接”,也许使用组?例如。等待 Groups.Add(Context.ConnectionId, "line1");等待 Groups.Add(Context.ConnectionId, "line2");
  • 嗨,我确实在文档中看到了那部分,但它周围的信息有点粗略。基本上我有以下几点。我在服务器上有两个继承自 Hub 的类。这两个类都实现了 OnConnect、OnDisconnect 方法。然后,这两个类都将详细信息存储在 HubClientCache 中。调用 OnConnect 时插入客户端 ID,调用 OnDisconnect 时删除客户端。
  • 一个集线器只处理一个相当复杂的用户呈现系统。第二个枢纽用于用户之间的通信。在 javascript 客户端中,我调用了 start 方法两次。每个集线器一个。在这个阶段,服务器上的两个集线器都完美地处理了 OnConnect 事件。但是例如在关闭浏览器时,只有 1 个服务器集线器会看到调用的 OnDisconnect 方法。
  • 检查OnDisconnected的另一个重载是否没有被调用。并不是说在最新版本中只有一个 OnDisconnected 方法(即没有重载)以避免混淆。

标签: signalr signalr-hub


【解决方案1】:

我认为您遇到的问题可能是由于您没有将任何事件处理程序(即客户端集线器方法)连接到未触发 OnDisconnected 的集线器。如果这确实是原因,则也不应在同一个 Hub 上触发 OnConnected。

The SignalR Hubs API Guide for the JavaScript client 在其“注释”之一中详细介绍了为什么会出现这种情况。以下是相关引述:

注意:通常在调用 start 方法建立连接之前注册事件处理程序。如果您想在建立连接后注册一些事件处理程序,您可以这样做,但您必须在调用 start 方法之前注册至少一个事件处理程序。原因之一是应用程序中可能有许多 Hub,但如果您只使用其中一个 Hub,您不希望在每个 Hub 上触发 OnConnected 事件。建立连接后,集线器代理上存在客户端方法就是告诉 SignalR 触发 OnConnected 事件的原因。如果您在调用 start 方法之前没有注册任何事件处理程序,您将能够调用 Hub 上的方法,但不会调用 Hub 的 OnConnected 方法,也不会从服务器调用任何客户端方法。

对 OnConnected 方法的每个引用都同样适用于 OnDisconnected 方法。

您可以在客户端上调用 start() 之前向 Hub 添加任意事件处理程序,以确保在该 Hub 上调用 OnConnected 和 OnDisconnected。事件处理程序是否永远不会被调用并不重要。例如:

$.connection.myHub.client.thisWillNeverBeCalled = function () { };

$.connection.hub.start()//...

只要第一行存在,就应该在 MyHub 上调用 OnConnected 和 OnDisconnected。

【讨论】:

  • 嗨 Halter,感谢您的精彩解释。我确实有两个集线器正常工作。在服务器上调用了两个 Onconnect 方法。我继续尝试了一些东西,但最终将两个集线器合并为一个集线器。
【解决方案2】:

最后,经过将近 2 天的故障排除和浏览网页寻找答案。 我最终只是将两个集线器合并为一个集线器。它可能不是最优雅的解决方案,但它确实完成了工作,现在可以在应用程序的其余部分取得进展。

感谢大家的建议:)

路易

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多