在 SignalR 2.0 中断开连接/重新连接后重新订阅事件



问题

我有一个 .NET 客户端应用程序,如果我的应用程序更改为"已关闭"状态,该应用程序使用 HubConnectionManager 重试连接到服务器。

在以下情况下,它似乎效果很好:

  1. 对于短暂断开连接(例如重新启动 SignalR 服务器),它会立即重新连接并从中断的位置继续。
  2. 对于较长时间的断开连接(如果服务器关闭超过 30 秒),它将从连接->重新连接->断开连接,然后再次连接即可。

但是,在情况 (2) 中,当客户端成功重新连接时,客户端以前订阅的任何事件都不会再发生。因此,实际上,客户端是连接的,但实际上是死的。

我尝试过什么

因此,重新连接在所有情况下都有效,但是如果我在断开连接后重新连接,则会丢失订阅。

因此,我最初尝试捕获StateChanged事件,并在从Connecting更改为Connected时,重新订阅服务器的广播(例如 _hubProxy.On<MachineStatusDto>(UPDATE_MACHINE_STATUS, BroadcastMachineStatus); )。但是,这似乎不起作用,我担心,如果我不小心,我可能会创建内存泄漏,就像多次使用 += 订阅一样。

不知道从这里去哪里...

其他详情

  • 客户端是 WPF(与 .NET 4 兼容)
  • 服务器是 Windows Service 自承载 SignalR(skys-the-limit .NET 4.5.2)
  • 客户端和服务器位于同一建筑物中,无限次重试连接是 A-OK。
  • 这是针对内部 LoB 应用,因此在互联网上广泛使用,这不是必需的

经过进一步调查,并在HubConnectionManager上运行我自己的客户端/服务器,我意识到我实际上是在重新连接并在之后接收订阅。

我的 LoB 应用程序的警告是,我的订阅基于组成员身份。根据MSDN:

"在暂时中断后重新连接时,用户 自动重新加入以前分配的组。自然而然 重新加入群组仅在重新连接时适用,不适用于 建立新的连接

因此,我重新连接成功,并且会收到服务器发送的任何全局消息。但是,在DisconnectTimeout后重新建立连接时,我必须将我的客户端重新添加到各自的Group中。

这是我使用的代码:

//Somewhere when initializing the connection
_hubConnectionManager.StateChanged += OnHubConnectionManagerOnStateChanged;
//Handler for state change
private void OnHubConnectionManagerOnStateChanged(StateChange st)
{
    //When disconnected, set state variable
    if (st.NewState == ConnectionState.Disconnected)
    {
        _wasDisconnected = true;
    }
    //If disconnected and we re-create connection successfully, re-subscribe to updates.
    if (_wasDisconnected && st.OldState == ConnectionState.Connecting && st.NewState == ConnectionState.Connected)
    {
        SubscribeToMachine(MachineStatusDetails.MachineId);
    }
    Messenger.Default.Send<ConnectionState>(st.NewState, UIMessageToken.ConnectionState);
}

最新更新