1

我正在通过 .Net 客户端连接到我的 SignalR 集线器,并且在服务器上调用函数工作正常,直到连接因重置 IIS 而丢失。一旦连接自动恢复,Invoke 将不再工作。

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

代码:

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

有任何想法吗?我应该注意,当客户端在本地运行并连接到 localhost 时不会发生这种情况;它仅在重新连接到其他服务器时发生。

4

2 回答 2

1

我遇到了同样的问题,并且已经检查了 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 并且我们已经设置了这个,所以为什么客户端没有检测到连接死亡!

于 2017-02-16T11:01:32.773 回答
0

并不是最好的解决方案,但是当状态更改为“重新连接”时,我最终只是重新初始化了连接。希望垃圾收集能够处理原始连接。

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

于 2017-02-21T15:00:52.327 回答