SignalR客户端在请求超时后始终保持重新连接状态

4
我正在使用最新的SignalR版本2.3.0与C#客户端。 我面临的问题在stackoverflow上已经提到。但是那个问题已经几年了,并且在github上已经关闭了。 我遇到的问题是,每当客户端向服务器发出请求超时时,客户端就会开始重新连接服务器,然后不断重新连接。我尝试在连接中定义WebSocket协议,但结果仍然相同。
 _connection.Start(new Transports.WebSocketTransport()).Wait(TimeSpan.FromSeconds(10));

我希望您能为服务器和客户端之间建立一个持久连接。
我已经添加了一个事件处理程序到StateChanged事件中,以便捕获SignalR客户端的状态变化。
这是重新连接状态的屏幕截图。

enter image description here

有人知道为什么会发生这种情况,以及如何预防吗?

1个回答

2
可能原因是您的 OnReconnect 事件没有触发,然后当客户端调用`stop`方法时,您的 OnDisconnected 也没有触发,正如这里所描述的那样:
如果客户端进入重新连接模式但在断开超时限制内无法建立传输连接,则服务器终止SignalR连接。当这种情况发生时,服务器执行Hub的OnDisconnected方法,并在客户端稍后连接时将断开消息排队发送到客户端。如果客户端随后重新连接,则接收断开命令并调用Stop方法。在这种情况下,当客户端重新连接时不会执行OnReconnected,当客户端调用Stop时不会执行OnDisconnected。
这是指SignalR版本2,但我认为对您也有帮助。
另外值得一提的是,如果您从“closed”事件(或JavaScript中的“disconnect”)调用 start ,那么您将持续尝试重新连接,如下所述:
在某些应用程序中,您可能希望在连接丢失且重新连接尝试已超时后自动重新建立连接。为此,可以从Closed事件处理程序(JavaScript客户端上的已断开连接事件处理程序)调用Start方法。您可能需要等待一段时间然后再调用Start,以避免在服务器或物理连接不可用时过于频繁地执行此操作。以下代码示例适用于使用生成的代理的JavaScript客户端。
无论如何,直到版本2,从服务器断开客户端的最简单方法是在客户端上实现 disconnect 方法并从服务器调用它,如下所述:
SignalR版本2没有内置的服务器API来断开客户端。将来计划添加此功能。在当前的SignalR版本中,从服务器断开客户端的最简单方法是在客户端上实现断开方法并从服务器调用该方法。

1
谢谢您的回复。您指引了我正确的方向。我已经检查了OnReconnected()事件,并发现在base.OnReconnected()事件之前编写了一些代码,导致异常。引起问题的代码行是HttpContext.Current.Request.ServerVariables["HTTP_HOST"]; 这在OnConnected()和OnReconnected通常情况下都可以正常工作,但在请求超时后重新连接时会抛出空引用异常。对此有什么想法吗? - prem
尝试按照文章中提到的,在关闭事件处理程序中调用start方法,这可能会有奇效。 - Barr J
1
问题出在关闭之前的重新连接事件上。现在我知道问题所在,可以使用解决方法,在标题中传递服务器URL,而不是使用HttpContext.Current.Request.ServerVariables["HTTP_HOST"]。感谢您的帮助,并在完成实现后一定将其标记为答案。 - prem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接