在 SignalR 2.0 中断开连接/重新连接后重新订阅事件
本文关键字:重新连接 新订阅 事件 连接 SignalR 中断 断开 | 更新日期: 2023-09-27 18:31:44
问题
我有一个 .NET 客户端应用程序,如果我的应用程序更改为"已关闭"状态,该应用程序使用 HubConnectionManager 重试连接到服务器。
在以下情况下,它似乎效果很好:
- 对于短暂断开连接(例如重新启动 SignalR 服务器),它会立即重新连接并从中断的位置继续。
- 对于较长时间的断开连接(如果服务器关闭超过 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);
}