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

时间:2014-11-24 22:32:33

标签: c# .net wpf signalr

问题

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

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

  1. 如果短暂断开连接(例如重新启动SignalR服务器),它会立即重新连接并从中断处继续。
  2. 如果长时间断开连接(如果服务器停机超过30秒),它将从已连接 - >重新连接 - >断开连接,然后再次连接就好了。
  3. HOWEVER ,在情况(2)中,当客户端成功重新连接时,客户端先前订阅的所有事件都不再通过。所以,实际上,客户端已经连接但实际上已经死了。

    我尝试过什么

    因此重新连接在所有情况下均可正常工作,但如果我在断开连接后重新连接,则会丢失我的订阅。

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

    不确定从这里开始......

    混杂。详情

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

1 个答案:

答案 0 :(得分:2)

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

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

  

&#34;在临时中断后重新连接时,用户   自动重新加入先前分配的组。自动   重新加入组只适用于重新连接,不适用时   建立新连接。&#34;

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

这是我使用的代码:

//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);
}