在意外断开客户端时通知SignalR服务器(可耻地)

时间:2016-12-01 09:24:55

标签: c# asp.net signalr signalr-hub

我正在设置我的GlobalHost配置,方法是在客户端无法访问时跟随this answer收听:

 GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(50);
 GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
 GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10);

覆盖 HUB类中的 OnDisconnected 方法设置客户端已断开连接

 public override Task OnDisconnected(bool stopCalled) {
       /*My code for saving the information of disconnecting*/
        return base.OnDisconnected(stopCalled);      
    }

我使用 Xamarin for android 作为客户端并通过覆盖我的活动的 OnStop()方法来调用 Stop()方法,像这样:

       protected override void OnStop()
        {

         //hubConnection.Stop(); previously I was using this but it takes too long to stop the hub connection in this way. so I wrote an explicit method and invoke it .

           Task hubconnection = serverHub.Invoke("StopConnection", new object[] { MethodToIdentifyDevice() }).ContinueWith(r =>
            {

            });


            base.OnStop();
        }

其次,我编写了一个明确的hubmethod来调用何时明确通知我的服务器我的客户端已停止工作。该方法适用于OnStop事件。

我的实际问题是,如果 上述所有内容都无法在活动停止应用程序关闭上调用 OnDisconnected 方法。

是否有任何我想念的东西都没有让它发生。

更新: 我已经尝试将传输级别更改为WebSocket,但是在intellisense中提到的Xamarin SDK for SignalR中没有提供它。 enter image description here

1 个答案:

答案 0 :(得分:2)

由于Xamarin没有WebSocketTransport,我建议使用“Ping”解决方法。

  1. 在服务器端实施Ping()方法。
  2. 定期从客户端调用此方法(比如超时间隔的1/2)。
  3. 在此方法中,将ConnectionIdDateTime键/值对保存到服务器端的静态ConcurrentDictionary
  4. 在服务器端运行后台任务,并检查DateTime是否有所有字典键。
  5. 删除旧的并拨打适当的代码。