【问题标题】:How to maintain SignalR Groups and Connections after SignalR server restart?SignalR 服务器重启后如何维护 SignalR 组和连接?
【发布时间】:2015-11-21 04:23:42
【问题描述】:

我的系统由

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

据我了解,一旦连接,这些客户端中的每一个都会有自己的关联ConnectionId

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

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

当服务器出现故障时,客户端的连接可能已断开。但这可以通过让客户端总是尝试在断开连接时重新连接来缓解。服务器启动后,客户端将重新连接。

但是,这个解决方案感觉很不稳定。特别是,我不确定一旦客户端重新连接它是否会保留相同的ConnectionId

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

【问题讨论】:

    标签: c# asp.net signalr signalr-hub


    【解决方案1】:

    是的,客户端重新连接总是发生在相同的连接ID。
    仅在以下情况下更新连接 ID:

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

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

    link to official documentation explaining this issue
    章节:服务器断开连接场景

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多