【问题标题】:Re-subscribing to events after disconnect/reconnect in SignalR 2.0在 SignalR 2.0 中断开/重新连接后重新订阅事件
【发布时间】:2014-11-26 01:20:10
【问题描述】:

问题

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

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

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

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

我的尝试

因此,在所有情况下都可以重新连接,但如果我在断开连接后重新连接,我的订阅就会丢失。

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

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

杂项。详情

  • 客户端是 WPF(.NET 4 兼容)
  • 服务器是 Windows 服务自托管 SignalR(skys-the-limit .NET 4.5.2)
  • 客户端和服务器位于同一建筑物中,无限重试连接是正常的。
  • 这适用于内部 LoB 应用,因此可以在 Internet 上广泛使用,因此不是必需的

【问题讨论】:

  • 我们在 .Net 远程处理方面遇到了类似的问题。您可以尝试在通信堆栈中进一步“重新启动”吗?也许在运输层面?类似,销毁并重新创建客户端。
  • 我发现了问题:在断开连接后,我不得不在失去组成员资格方面做更多事情。请参阅下面的答案。

标签: c# .net wpf signalr


【解决方案1】:

经过进一步调查,并在 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);
}

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2018-01-28
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多