我有一个MVC 4应用程序,SignalR同时连接到许多Android平板电脑。当设备进入休眠状态时,一些连接会丢失,一些连接会被维护,似乎没有模式。
我在视图上有以下代码,尝试在断开连接时重新启动连接:
$.connection.hub.disconnected( function () {
setTimeout( function () {
$.connection.hub.start();
}, 5000);
});
我在Application_Start()方法中也有以下几行:
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromHours( 6 );
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromHours( 6 );
据我所知,6小时过量,这样做是为了确保测试期间连接永远不会超时。
我还设置了平板电脑,以便在睡眠期间保持Wi-Fi连接。
然而,当平板电脑进入睡眠状态时,几分钟后才会醒来,某些连接仍然处于活动状态,而其他连接则不会。
当设备从睡眠状态恢复时,如何确保维持或重新启动SignalR连接?
答案 0 :(得分:3)
当您的设备从睡眠状态恢复时,您的问题中的以下代码似乎是重启SignalR连接的正确方法:
$.connection.hub.disconnected( function () {
setTimeout( function () {
$.connection.hub.start();
}, 5000);
});
不需要为了您的目的更改ConnectionTimeout配置。 ConnectionTimeout几乎完全由长轮询传输使用,以决定在关闭当前轮询和重新关联之前等待新消息的时间。默认为110秒,因为许多代理将在2分钟内终止待处理的HTTP请求。
根据您的建议,将DisconnectTimeout提升至6小时肯定是过度的。它将导致服务器在内存中保持丢失连接六个小时。
如果您还没有阅读过,答案 1 :(得分:0)
我已经制定出一直有效的解决方案。
无论出于何种原因,Android平板电脑永远不会触发$ .connection.hub.disconnected()函数。
在Application_Start()方法中设置以下值修复了问题
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromHours( 3 );
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromHours( 3 );
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds( 10 );
这些值设置得非常大,但我必须让DisconnectTimeout和ConnectionTimeout都大于设备处于睡眠状态的时间。 KeepAlive必须小到足以在醒来后的合理时间内开火。
我在受控环境中运行此应用程序,所以这项工作正常,但我确定不是理想的解决方案
答案 2 :(得分:0)
SignalR(版本2.0.1及更低版本)中存在一个错误,当客户端连接一次后触发断开连接的事件时,状态保持连接状态或连接状态(https://github.com/SignalR/SignalR/issues/2554 - 在2.0版中解决。 2)。
您可以通过在超时时间内触发重启来绕过此功能:
$.connection.hub.disconnected(function () {
setTimeout(function () {
$.connection.hub.start()
.done(function () {
console.log('Connection establish! Now lets take over the world.');
// DO STUFF HERE
});
}, 10000);
});