信号服务器端,OnDisconnect仅调用1个集线器

时间:2014-09-03 06:09:22

标签: signalr signalr-hub

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

我遇到的问题是,虽然我知道SignalR客户端,集线器 将分享一个连接。我遇到的问题是,当我关闭浏览器,或者在客户端上调用stop时。

将触发我的服务器端OnDisconnect(bool stopCalled)事件中的一个

我不知何故预计,当客户端断开连接时,两者都会触发。

我是愚蠢还是做错了? 任何信息将不胜感激。

路易斯

2 个答案:

答案 0 :(得分:3)

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

The SignalR Hubs API Guide for the JavaScript client在其中一个"注释"中详细介绍了一些内容。关于为什么会这样。这是相关的引用:

  

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

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

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

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

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

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

答案 1 :(得分:0)

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

感谢大家的建议:)

路易斯