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

本文关键字:SignalR 维护 连接 重新启动 服务器 | 更新日期: 2023-09-27 18:23:39

我的系统由组成

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

据我所知,一旦连接,这些客户端中的每一个都将拥有自己关联的ConnectionId

现在,我想实现一个恢复策略,在SignalR服务器重新启动后,它应该仍然保留它在集线器中曾经拥有的组和连接。

我想通过将Groups和ConnectionId存储在外部存储(例如数据库)中,并在应用程序启动时恢复它来实现这一点。

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

然而,这种解决方案让人感觉相当不稳定。特别是,我不确定一旦客户端重新连接,它是否会保留相同的ConnectionId

这种方法有意义吗?有更好的方法吗?

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

是的,客户端重新连接总是使用相同的连接ID
只有在以下情况下才续订连接ID:

  1. connection.stop()方法是从客户端调用的
  2. 服务器检测到客户端断开连接,并在服务器上执行断开连接+向碰巧重新连接太迟的客户端发送断开连接消息。然后这些客户端将关闭连接。所以客户端服务器再次同步

如果客户端连接到将要重新启动的服务器,则客户端会在断开连接时注意到,并尝试在给定的时间范围内使用相同的connectionID重新连接到服务器,所有这些都是由连接超时定义的
如果服务器在连接超时帧内重新启动,客户端将使用现有ID重新连接到服务器。在这种情况下,在服务器上触发Reconnect()事件,而没有发生OnConnected()事件。这是一个特殊的信号机案例
对Reconnect()事件进行非常防御性的编码

链接到解释此问题的官方文档
章节:服务器断开连接场景