通知SignalR服务器上的客户端断开连接不留神(可耻)
问题描述:
我设置我的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中没有提供它。
答
既然WebSocketTransport在Xamarin中不可用,我建议使用“Ping”解决方法。
- 在服务器端实施
Ping()
方法。 - 定期从客户端调用此方法(例如,超时间隔的1/2)。
- 在此方法中,在服务器端将
ConnectionId
:DateTime
键/值对保存为静态ConcurrentDictionary
。 - 在服务器端运行后台任务并检查所有字典密钥的
DateTime
。 - 删除旧的并调用适当的代码。
+0
ping是非常不高效的方式,特别是在使用某些数据受限的网络时,如涉及某些层 – Technacron
您使用哪种传输方式连接到SignalR服务器?尝试使用像'hubConnection.Start(新的WebSocketTransport())' 它会帮助吗? –
它使用.NetFramework 4.5 – Technacron
我不是指平台。我的意思是在客户端指定的传输。请检查[此链接](https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-net-client#transport)作为参考。 默认的传输是LongPollingTransport,它意外地工作一点点,正如你所描述的:-) WebSocketTransport应该可以解决你的问题,但我知道在Xamarin中的web套接字存在重大问题。所以试着去检查一下。 –