代码之家  ›  专栏  ›  技术社区  ›  Louis Lewis

Signalr服务器端,OnDisconnect仅为1个集线器调用

  •  0
  • Louis Lewis  · 技术社区  · 10 年前

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

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

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

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

    路易斯

    2 回复  |  直到 10 年前
        1
  •  3
  •   halter73    10 年前

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

    The SignalR Hubs API Guide for the JavaScript client 在其中一篇“笔记”中详细介绍了为什么会出现这种情况。以下是相关报价:

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

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

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

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

    只要有第一行,就应该调用OnConnected和OnDisconnected MyHub .

        2
  •  0
  •   Louis Lewis    10 年前

    最后,在经历了近两天的拍摄和浏览网络寻找答案的麻烦之后。 我最终只是将两个中心合并为一个中心。这可能不是最优雅的解决方案,但它确实完成了任务,现在可以在应用程序的其他部分取得进展。

    谢谢大家的建议:)

    路易斯