2016-12-01 178 views
1

我设置我的GlobalHost配置这样按照this answer时候听一听客户端是无法访问通知SignalR服务器上的客户端断开连接不留神(可耻)

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

而且重写OnDisconnected方法在我的HUB类设置客户端已断开连接

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

我使用Xamarin的Android作为客户端和调用停止()方法通过重写调用OnStop()我的活动方法,像这样:

 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,但在智能感知中提到的SignalR的Xamarin SDK中没有提供它。 enter image description here

+0

您使用哪种传输方式连接到SignalR服务器?尝试使用像'hubConnection.Start(新的WebSocketTransport())' 它会帮助吗? –

+0

它使用.NetFramework 4.5 – Technacron

+1

我不是指平台。我的意思是在客户端指定的传输。请检查[此链接](https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-net-client#transport)作为参考。 默认的传输是LongPollingTransport,它意外地工作一点点,正如你所描述的:-) WebSocketTransport应该可以解决你的问题,但我知道在Xamarin中的web套接字存在重大问题。所以试着去检查一下。 –

回答

2

既然WebSocketTransport在Xamarin中不可用,我建议使用“Ping”解决方法。

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

ping是非常不高效的方式,特别是在使用某些数据受限的网络时,如涉及某些层 – Technacron