【问题标题】:SignalR client keeps reconnecting after request timeoutSignalR 客户端在请求超时后不断重新连接
【发布时间】:2018-08-20 14:41:43
【问题描述】:

我正在使用带有 C# 客户端的最新 SignalR 版本 2.3.0。 我面临的问题是在stackoverflow 上提到了here。但是这个问题已经有几年的历史了,它已经在 github 上关闭了。

我面临的问题是,每当从客户端到服务器的请求超时时,客户端就会开始重新连接到服务器,然后继续重新连接。我也尝试在连接中定义 WebSocket 协议,但结果仍然相同。

 _connection.Start(new Transports.WebSocketTransport()).Wait(TimeSpan.FromSeconds(10));

我正在寻找服务器和客户端之间的持久连接。

我在 StateChanged 事件上添加了一个事件处理程序来捕获 SignalR 客户端的状态变化。

这是重新连接状态的截图

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

【问题讨论】:

    标签: c# signalr


    【解决方案1】:

    原因可能是因为您的OnReconnect 甚至没有触发,然后当客户端调用here 所述的`stop 方法时,您的OnDisconnected 也没有触发:

    如果客户端进入重新连接模式但无法建立 在断开超时限制内传输连接,服务器 终止 SignalR 连接。发生这种情况时,服务器 执行集线器的 OnDisconnected 方法并将断开连接排队 在客户端设法连接时发送给客户端的消息 之后。如果客户端然后重新连接,它会收到断开连接 命令并调用 Stop 方法。在这种情况下, OnReconnected 是 客户端重连时不执行,OnDisconnected不执行 在客户端调用 Stop 时执行。

    这里指的是 SignalR 版本 2,但我相信它也会对你有所帮助。

    同样值得一提的是,如果您从 closed 事件(或 JavaScript 中的 disconnect)调用 start,您将有争议地尝试重新连接,如前所述:

    在某些应用程序中,您可能希望自动重新建立一个 连接丢失后尝试重新连接 时间到。为此,您可以从 Closed 调用 Start 方法 事件处理程序(JavaScript 客户端上断开连接的事件处理程序)。你 可能需要等待一段时间才能调用 Start 以便 避免在服务器或物理 连接不可用。以下代码示例适用于 JavaScript 客户端使用生成的代理。

    无论如何,在版本 2 之前断开客户端与服务器的连接的最简单方法是在客户端上实现 disconnect 方法,然后从服务器调用它:

    SignalR 版本 2 没有内置的服务器 API 断开客户端。有计划添加此功能 在将来。在当前的 SignalR 版本中,最简单的方法是 断开客户端与服务器的连接是实现断开连接 客户端上的方法并从服务器调用该方法。

    【讨论】:

    • 感谢您的回复。你为我指明了正确的方向。我检查了 OnReconnected() 事件,发现我在导致异常的 base.OnReconnected() 事件之前编写了一些代码。导致问题的代码行是 HttpContext.Current.Request.ServerVariables["HTTP_HOST"];这工作正常 OnConnected() 和 OnReconnected 正常,但在请求超时后重新连接时抛出空引用。对此有任何想法吗?
    • 尝试从文章中提到的关闭的事件处理程序中调用 start 方法,它可能会变魔术。
    • 问题是在关闭前重新连接事件。现在,当我知道问题时,我可以使用解决方法并在标头中传递服务器 url,而不是使用 HttpContext.Current.Request.ServerVariables["HTTP_HOST"];感谢您的帮助,在完成我的实施后一定会将其标记为答案。
    猜你喜欢
    • 2019-10-19
    • 2021-12-05
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多