我通过.Net客户端连接到我的SignalR集线器,并且在服务器上调用某个函数正常工作,直到重置IIS失去连接。一旦自动恢复连接,Invoke就不再有效。
我在网络应用程序的日志记录中验证了.Net客户端是否成功重新连接,并且客户端的连接状态正在变回连接状态。但Invoke电话并没有做任何事情。另外,如果我在调用上调用Wait(),它将永远挂起。
代码:
//Works fine before connection lost, but hangs after connection restored
myProxy.Invoke("MyServerFunction", param1).Wait();
有什么想法吗?我应该注意,当客户端在本地运行并连接到localhost时,这不会发生;它只在重新连接到不同的服务器时发生。
答案 0 :(得分:1)
我遇到了同样的问题,并且已经使用有线鲨鱼进行了检查,但是我的中心没有向我的客户端传出流量。 沟通的另一种方式是正确流动!
到目前为止,我还没有能够建立解决方案,但会让你发布,只是想分享我的发现。
添加了对集线器和客户端的跟踪,并注意到集线器关闭了连接,但客户端没有。 来自Hub日志文件:
SignalR.Transports.TransportHeartBeat Verbose: 0 : d1992c3d-fbec-43e6-9662-b3e94af39418 is dead
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection d1992c3d-fbec-43e6-9662-b3e94af39418
在客户端登录时,它会继续使用相同的连接
02:34:36.3191340 - d1992c3d-fbec-43e6-9662-b3e94af39418 - OnMessage({"I":"232"})
Hover曾经是以下类型的常规消息,不再发送。
02:34:35.2053710 - d1992c3d-fbec-43e6-9662-b3e94af39418 - LP: OnMessage({"C":"d-7D145E50-B,18|N,5|O,1","M":[]})
02:34:35.2073150 - d1992c3d-fbec-43e6-9662-b3e94af39418 - LP Poll: http://172.16.2.101:8074/signalr/poll?clientProtocol=1.4&transport=longPolling&connectionData= ...
从此页面Signal R on the wire 我了解到{{I“:”232“}消息意味着:服务器void方法已成功完成。
哪个是正确的,因为我可以在集线器中处理它们时看到更新。但是当我在同一个连接ID上调用一个方法时,没有任何反应。这并不奇怪,因为Hub认为连接已经死了!
那么为什么连接消息在集线器上死机,但是集线器仍能处理来自该连接的消息呢?
其他调查结果:Here提到“客户端保持活动检查未用于长轮询传输”,我发现了一个引用here,默认情况下这确实被禁用 以及关于此问题的最后评论是“......停止接收来自服务器的通信...”
如果我理解正确,我们通过设置GlobalHost.Configuration.KeepAlive
使客户端保持活跃状态
我们设置了这个,所以为什么客户端没有检测到连接死亡!
答案 1 :(得分:0)
不是最好的解决方案,但是当状态变为“重新连接”时,我最终只是重新初始化连接。希望垃圾收集将处理原始连接。
希望最终能解决这个问题。