2017-02-14 143 views
1

我通过.Net客户端连接到我的SignalR集线器,并且调用服务器上的功能正常工作,直到连接从重置IIS丢失为止。一旦连接自动恢复,调用不再起作用。SignalR Invoke在重新连接后停止工作

我在Web应用程序的日志记录中验证了.Net客户端正在成功重新连接,并且客户端的连接状态正在变回已连接。但Invoke调用没有做任何事情。另外,如果我在调用时调用Wait(),它将永远挂起。

代码:

//Works fine before connection lost, but hangs after connection restored 
myProxy.Invoke("MyServerFunction", param1).Wait(); 

任何想法?我应该注意到,当客户端在本地运行并连接到本地主机时,不会发生这种情况;只有在重新连接到不同的服务器时才会发生。

回答

0

我遇到了同样的问题,并检查了线鲨鱼,但没有从我的集线器到我的客户端的传出流量。 通信的另一种方式是正确流动!

到目前为止,我还没有能够建立一个解决方案,但会让你张贴,只是想分享我的发现。

添加了对集线器和客户端的跟踪,并注意到集线器关闭了连接,但客户端没有。 从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"}) 

哈弗曾经有以下类型的常规消息,这不再是在客户端上发送。

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”}消息意味着:服务器空隙方法已成功完成。

这是正确的,因为我可以在集线器中处理更新。但是当我在同一个连接ID上调用一个方法时,什么也没有发生。这并不奇怪,因为中心认为这种联系已经死了!

那么,为什么传出消息的集线器上的连接死了,但集线器仍然能够处理来自该连接的消息传递?

其他调查结果:Here中提到,“客户端保持活动检查未用于长轮询运输”,我发现了一个参考here这的确是禁用默认并在此问题上的最后一个注释是“......停止接收通信从服务器来了...”

如果我理解正确的话,我们使客户保持活动设置:GlobalHost.Configuration.KeepAlive 现在我们提出这一点,所以仍然为什么客户端无法检测到连接死!

+0

您是否看到正在创建的新连接?因为听起来客户端正在使用传入流量的新服务,但Invoke仍在使用旧的连接。 –

+0

客户端仍在使用旧连接,在Hub中有一个OnDisconnected,但从来没有新的OnConnected或OnReconnected。不过,我发现中心枢纽回答与“我”的消息,但认为连接已经死亡,这很奇怪。刚刚发现这似乎是相同的,但在里程碑2.1.2中关闭,我们正在使用版本2.2:[问题3259](https://github.com/SignalR/SignalR/issues/3259)重新连接过程从未触发在客户端,它停止接收来自服务器的任何通信 – Boscabouter

0

不是最好的解决方案,但当状态更改为“重新连接”时,我结束了重新初始化连接。希望垃圾收集将照顾原始连接。

希望这个问题最终会得到解决。

相关问题