【发布时间】:2014-11-26 01:20:10
【问题描述】:
问题
我有一个 .NET 客户端应用程序,它使用 HubConnectionManager 在我的应用程序更改为关闭状态时重试连接到服务器。
它似乎在以下情况下效果很好:
- 对于短暂的断开连接(例如重新启动 SignalR 服务器),它会立即重新连接并从中断处继续。
- 对于更长的断开连接(如果服务器关闭超过 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 远程处理方面遇到了类似的问题。您可以尝试在通信堆栈中进一步“重新启动”吗?也许在运输层面?类似,销毁并重新创建客户端。
-
我发现了问题:在断开连接后,我不得不在失去组成员资格方面做更多事情。请参阅下面的答案。