我们遇到过这个链接,它指定了不同的超时属性:https://github.com/SignalR/SignalR/wiki/Configuring-SignalR
还有一篇关于SignalR客户端和SignalR服务器之间如何断开连接和重新连接的优秀帖子(When does a reconnect in signalR occour?) .
只是为了重复上述帖子中的不同情况:
“当客户端脱机然后不久重新获得连接时,就会发生集线器重新连接.SignalR配置值很大程度上决定了以下示例的时间戳,因此不要逐字记录时间 .
以下是几个涉及重新连接行为的示例及其结果(时间格式m:ss):
Situation 1
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - 由于ISP问题,客户端失去连接(并意识到它失去了连接)
0:15 - 客户重获连接
0:16 - 触发OnReconnected事件
Situation 2
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)
0:15 - 客户重获连接
这里可能发生两件事
答:0:16 - 没有任何反应,客户继续使用之前的连接
B:0:~45 - 客户端实现断开连接*
B:0:46-客户端转换到重新连接状态
B:0:47 - 客户端成功重新连接并触发OnReconnected事件 .
Situation 3
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)
0:~45 - 客户实现其断开连接*
0:46 - 客户端转换到重新连接状态
1:15 - 服务器确定客户端已经消失了太长时间然后忘记它,排队一个“断开连接”命令,让客户端接收它,如果它稍后重新连接 . ***
1:15 - OnDisconnect以1:16触发 - 客户重新获得连接
1:17 - 客户端进行“软”重新连接(不触发OnReconnected)
1:18 - 客户端检索“disconnect”命令
1:19 - 客户端调用“停止”并进行软断开(不触发OnDisconnected)
Situation 4
0:00 - 客户端连接到服务器,触发OnConnected
0:10 - 由于拔出以太网电缆,客户端失去连接(未意识到它已断开连接)
0:~45 - 客户实现其断开连接*
0:46 - 客户端转换到重新连接状态
1:15 - 服务器确定客户端已经消失了太长时间然后忘记它,排队一个“断开连接”命令,让客户端接收它,如果它稍后重新连接 . ***
1:15 - OnDisconnect在1:30触发 - 客户端停止尝试重新连接(尝试时间过长)**
1:30 - 客户端转换为断开状态
- 由于客户端保持活动检查:用于确定客户端由于缺乏保持活动而何时脱机 . 不用于长轮询运输
**由于客户端断开超时:用于确定客户端何时重新连接太长时间并且服务器可能在此期间忘记了客户端
***由于服务器断开超时:用于确定何时应该忘记客户端 . 一旦连接在服务器上被标记为死亡,它就会开始累积 . 最终,服务器为客户端的主题排队断开命令,该命令告诉客户端(如果它重新连接)它需要启动新连接 . 当主题被清理时,该命令将从服务器中消失 . “
我们发现,我们在.NET SignalR客户端和ASP.NET MVC SignalR服务器之间经常断开连接并重新连接(上面的1和2),并断开不会导致重新连接的连接(上面的3和4) . 我们知道正在使用ServerSentEvents协议 .
我们很难知道调整(增加或减少)所需的超时属性:
-
减少断开连接和重新连接的次数 .
-
根本不会在情况3和4中结束 .
这里要注意的一件重要事情是我们的.NET SignalR Client实际上是一个连接到服务器的Windows服务 .
我们目前只保留默认值,即:
-
ConnectionTimeout = 110秒
-
DisconnectTimeout = 30秒
-
KeepAlive = 30秒
此外,我们正在使用SignalR 1.0.1 .
3 回答
您的超时设置正确 . 在当前版本中,.net客户端没有客户端保持活动以确保客户端维护连接 .
在下一个版本中,您将有一个.net客户端保持活着 . 如果您愿意使用项目的开发版本,则该功能目前可在开发分支https://github.com/SignalR/SignalR/tree/dev上使用 .
另外供参考,这里's the issue related to what you'看到https://github.com/SignalR/SignalR/issues/741 .
.NET客户端还没有这种行为 . 如果客户端突然断开连接,它将不会重新连接 . 它将在1.1 .
你在使用SignalR 1.0.1吗? Taylor对重新连接过程的描述适用于SignalR版本> = 1.0和JS客户端 . 我问的原因是因为在SignalR> = 1.0时,
KeepAlive
必须不超过DisconnectTimeout
的三分之一 .KeepAlive
和DisconnectTimeout
绝对不能相等 .但是,如果1.0 . *在
KeepAlive
之后设置DisconnectTimeout
,则keep-alive将设置为DisconnectTimeout
的三分之一 . 在您的情况下,这将是10秒默认值 .在SignalR 1.0中解决了很多问题,所以如果你没有,那肯定值得升级 . 虽然,正如其他答案所指出的那样,.NET客户端将不支持保持活动检查,并且在1.1之前无法识别网络电缆已被拔掉
附:如果您意识到它已断开连接,您始终可以手动重新启动
Connection
. 在这种情况下,您的连接ID当然会改变 .