SignalR中的重新连接是在什么时候发生的?

53

我开始使用SignalR,试图弄清楚Hub Reconnect何时发生。在网上没有找到令人满意的解释。有人能解释一下何时/为什么会发生重新连接吗?


1
当主机突然宕机时会出现什么情况?连接到主机的所有客户端都无法接收任何消息。您如何解决或捕获这个问题? - Kris Nobels
嗨 @LeMoustique,我认为这值得在SO上提一个单独的问题。 - gsharp
1个回答

86

当客户端断开连接然后在短时间内重新连接时,将发生重新连接(hub reconnect)事件。下面是几个涉及重新连接行为的示例和它们的结果(时间格式 m:ss)。以下示例中,SignalR 配置值在很大程度上确定时间戳,因此不要直接以示例中的时间为准。

提到以下内容时,我指的是服务器端的 Hub 方法

  • OnConnected:客户端连接成功时触发
  • OnDisconnected:客户端失去连接时触发
  • OnReconnected:客户端重新连接成功时触发

1)
0:00 - 客户端连接到服务器,触发 OnConnected 事件
0:10 - 客户端由于 ISP 问题丢失连接(并意识到已经断开连接)
0:15 - 客户端重新连接成功
0:16 - 触发 OnReconnected 事件。

2)
0:00 - 客户端连接到服务器,触发 OnConnected 事件
0:10 - 客户端由于拔掉以太网线而失去连接(没有意识到已经断开连接)
0:15 - 客户端重新连接成功
此时会出现两种情况:
A: 0:16 - 什么也不会发生,客户端将继续使用先前的连接
B: 0:~45 - 客户端意识到已经断开连接 *
B: 0:46 - 客户端转换为重新连接状态
B: 0:47 - 客户端成功重新连接,触发 OnReconnected 事件。

3)
0:00 - 客户端连接到服务器,触发 OnConnected 事件
0:10 - 客户端由于拔掉以太网线而失去连接(没有意识到已经断开连接)
0:~45 - 客户端意识到已经断开连接 *
0:46 - 客户端转换为重新连接状态
1:15 - 服务器确定客户端离线时间过长,然后忘记该客户端,如果稍后重新连接,则排队等待“断开”命令。
1:15 - 触发 OnDisconnected 事件
1:16 - 客户端重新连接成功
1:17 - 客户端进行“软”重新连接(不触发 OnReconnected 事件)

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

4)
0:00 - 客户端连接到服务器,触发OnConnected事件
0:10 - 客户端因拔出以太网电缆而失去连接(没有意识到已经断开连接)
0:~45 - 客户端意识到它已经断开连接 *
0:46 - 客户端转换为重新连接状态
1:15 - 服务器确定客户端离开的时间过长,然后忘记该客户端,并排队等待一个“断开”命令,以便稍后重新连接时接收。 ***
1:15 - 触发OnDisconnected事件
1:30 - 客户端停止尝试重新连接(尝试时间太长)**
1:30 - 客户端转换为已断开状态

*由于客户端端保持活动检查:用于确定客户端是否由于缺乏保持活动而离线。 不适用于长轮询传输

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

***由于服务器断开超时:用于确定何时应忘记客户端。 这是一个时间跨度,一旦服务器将连接标记为死亡状态,就开始累计。 最终,服务器会为客户端的主题排队一个断开命令,该命令会告诉客户端(如果重新连接)需要开始一个新的连接。 当主题清理时,命令将从服务器中消失。


7
非常好的答案!SignalR的开发人员应该将其放入他们的维基中 :-) 非常感谢。 - gsharp
4
当客户端重新连接时,Context.ConnectionID会发生什么变化?它是否保持不变还是会改变?另外,当SignalR客户端“重新连接”到服务器时,在该过程中是否会调用OnDisconnected方法?换句话说,“重新连接”是否意味着(OnDisconnected+OnConnected)? - Bhavin
3
连接 ID 将保持不变。在 OnDisconnected 之后永远不会调用 Reconnected。因此你可以从 OnConnected -> OnReconnected 和 OnConnected -> OnDisconnected,但你永远不能从 OnDisconnected -> OnReconnected。 - N. Taylor Mullen
1
没错,你总是可以在客户端处理断开连接事件,然后重新启动连接以恢复连通性。 - N. Taylor Mullen
2
这里还有一个优秀且官方的解释:http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events。 - John
显示剩余4条评论

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