SignalR超时属性

时间:2013-03-21 00:43:19

标签: signalr signalr-hub signalr.client

我们遇到过此链接,指定了不同的超时属性: https://github.com/SignalR/SignalR/wiki/Configuring-SignalR

还有一篇关于SignalR客户端和SignalR服务器之间如何断开连接和重新连接的优秀帖子(When does a reconnect in signalR occour?)。

只是重复上述帖子中的不同情况:

“当客户端脱机然后不久重新获得连接时,就会发生集线器重新连接.SignalR配置值很大程度上决定了以下示例的时间戳,因此不要逐字记录。

以下是几个涉及重新连接行为的示例及其结果(时间格式m:ss):

情况1

0:00 - 客户端连接到服务器,触发OnConnected

0:10 - 客户因ISP问题而失去连接(并意识到它失去连接)

0:15 - 客户重获连接

0:16 - 触发OnReconnected事件

情况2

0:00 - 客户端连接到服务器,触发OnConnected

0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)

0:15 - 客户重获连接

这里可能发生两件事

答:0:16 - 没有任何反应,客户继续使用之前的连接

B:0:~45 - 客户端实现断开连接*

B:0:46 - 客户端转换到重新连接状态

B:0:47 - 客户端成功重新连接并触发OnReconnected事件。

情况3

0:00 - 客户端连接到服务器,触发OnConnected

0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)

0:~45 - 客户端实现其断开连接*

0:46 - 客户端转换到重新连接状态

1:15 - 服务器确定客户端已经消失了太长时间然后忘记它,排队一个“disconnect”命令让客户端接收,如果它稍后重新连接。 ***

1:15 - 触发OnDisconnect 1:16 - 客户重新获得连接

1:17 - 客户端进行“软”重新连接(不触发OnReconnected)

1:18 - 客户端检索“disconnect”命令

1:19 - 客户端调用“停止”并进行软断开(不触发OnDisconnected)

情况4

0:00 - 客户端连接到服务器,触发OnConnected

0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)

0:~45 - 客户端实现其断开连接*

0:46 - 客户端转换到重新连接状态

1:15 - 服务器确定客户端已经消失了太长时间然后忘记它,排队一个“disconnect”命令让客户端接收,如果它稍后重新连接。 ***

1:15 - OnDisconnect在1:30触发 - 客户端停止尝试重新连接(尝试时间过长)**

1:30 - 客户端转换为断开状态

  • 由于客户端保持活动检查:用于确定客户端由于缺乏保持活动而何时处于脱机状态。不用于长轮询运输

**由于客户端断开连接超时:用于确定客户端何时重新连接太长时间并且服务器可能在此期间忘记了客户端

***由于服务器断开连接超时:用于确定何时应该忘记客户端。一旦连接在服务器上被标记为死亡,它就会开始累积。最终,服务器为客户端的主题排队断开命令,该命令告诉客户端(如果它重新连接)它需要启动新连接。当主题被清理时,该命令将从服务器中消失。“


我们发现,我们在.NET SignalR客户端和ASP.NET MVC SignalR服务器之间经常断开连接并重新连接(上面的1和2),并断开不会导致重新连接的连接(3和4)以上)。我们知道正在使用ServerSentEvents协议。

很难知道我们需要调整(增加或减少)的超时属性为:

  1. 减少断开连接和重新连接的次数。
  2. 根本不是在情况3和4中结束。
  3. 这里需要注意的一点是,我们的.NET SignalR Client实际上是一个连接到服务器的Windows服务。

    我们目前只保留默认值,即:

    • ConnectionTimeout = 110秒
    • DisconnectTimeout = 30秒
    • KeepAlive = 30秒

    此外,我们正在使用SignalR 1.0.1。

3 个答案:

答案 0 :(得分:8)

.NET客户端 NOT 还有此行为。如果客户端突然断开连接,它将不会重新连接。它将在1.1。

答案 1 :(得分:6)

您的超时设置正确。在当前版本中,.net客户端没有客户端保持活动状态,以确保客户端保持连接。

在下一个版本中,您将有一个.net客户端保持活跃状态​​。如果您愿意使用该项目的开发版本,该功能目前可在开发分支https://github.com/SignalR/SignalR/tree/dev上使用。

另外,仅供参考,以下是与您所看到的内容相关的问题https://github.com/SignalR/SignalR/issues/741

答案 2 :(得分:4)

您使用的是SignalR 1.0.1吗? Taylor对重新连接过程的描述适用于SignalR版本> = 1.0和JS客户端。我问的原因是因为在SignalR> = 1.0中,KeepAlive必须不超过DisconnectTimeout的三分之一。 KeepAliveDisconnectTimeout绝对不能相等。

但是,如果1.0。*在DisconnectTimeout之后设置KeepAlive,则保持活动将设置为DisconnectTimeout的三分之一。在您的情况下,这将是10秒的默认值。

很多问题在SignalR 1.0中得到了解决,所以如果你没有,那肯定值得升级。虽然,正如其他答案所指出的那样,.NET客户端将不支持保持活动检查,并且在1.1之前无法识别网络电缆已被拔掉。

P.S。如果您意识到它已断开连接,您可以随时手动重新启动Connection。在这种情况下,您的连接ID当然会改变。