我遇到了同样的问题,并且已经检查了 Wire Shark,但是没有从我的集线器到我的客户的传出流量。沟通的另一种方式是正确的!
到目前为止,我还没有能够建立一个解决方案,但会随时通知你,只是想分享我的发现。
添加了对集线器和客户端的跟踪,并注意到集线器关闭了连接,但客户端没有。从集线器日志文件:
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"} 消息意味着:服务器 void 方法已成功完成。
这是正确的,因为我可以看到在集线器中处理的更新。但是当我在同一个连接 ID 上调用一个方法时,什么也没有发生。这并不奇怪,因为 Hub 认为该连接已死!
那么为什么集线器上的传出消息连接失效,但集线器仍然能够处理来自该连接的传入消息?
其他发现:这里提到“客户端保持活动检查不用于长轮询传输”,我在这里找到了一个参考,默认情况下这确实被禁用,关于这个问题的最后评论是“......停止接收来自服务器的通信……”
如果我理解正确,我们通过设置使客户端保持活动状态:GlobalHost.Configuration.KeepAlive
并且我们已经设置了这个,所以为什么客户端没有检测到连接死亡!