如何在SignalR服务器重启后维护SignalR组和连接?

3

我的系统由以下内容组成:

  1. SignalR服务器
  2. 多个C#客户端连接到SignalR服务器。

据我所知,一旦连接,每个客户端都会有自己的关联ConnectionId

现在,我想实现一个弹性策略,在SignalR服务器重新启动后,它仍然应保留之前在Hub中拥有的群组和连接。

我考虑通过将群组和ConnectionIds存储在外部存储(例如数据库)中,并在应用程序启动时进行恢复来实现此目的。

当服务器关闭时,客户端的连接可能已断开。但是这可以通过使客户端在断开连接时始终尝试重新连接来在一定程度上减轻。一旦服务器重新启动,客户端就会重新连接。

然而,这个解决方案似乎有些不可靠。特别是,我不确定一旦客户端重新连接,它是否会保留相同的ConnectionId

这种方法合理吗?有更好的方法吗?

1个回答

2

是的,客户端重新连接始终使用相同的connectionID。
仅在以下情况下才会更新connectionID:

  1. 客户端调用connection.stop()方法,
  2. 服务器检测到客户端断开连接并在服务器上执行断开操作+发送断开消息给稍晚重新连接的客户端。然后这些客户端将关闭连接。因此,客户端和服务器再次同步。

如果客户端连接到即将重启的服务器,则客户端将在断开连接时注意到并在规定的时间范围内尝试使用相同的connectionID重新连接到服务器,该时间范围由connection-timeout定义。
此后,如果服务器在连接超时范围内重新启动,则客户端将使用现有ID重新连接到服务器。 在这种情况下,Reconnect()事件在服务器上被触发,而OnConnected()事件没有发生。这是Signalr的一个特殊情况。
请在编写Reconnect()事件时非常小心谨慎。

官方文档链接,说明此问题
章节:服务器断开连接方案


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