我有一个与SignalR同时连接到许多安卓平板电脑的MVC 4应用程序。当设备进入睡眠状态时,一些连接丢失,而一些连接被维护,似乎没有模式。
视图上有以下代码试图在断开连接时重新启动连接:
$.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连接。
然而,当平板电脑进入睡眠状态后,几分钟后就会醒来,一些连接将仍然处于活动状态,而其他连接则不会。
如何确保当设备从睡眠中恢复时,SignalR连接将被维护或重新启动?
发布于 2014-02-13 22:20:55
我已经想出了一个行之有效的解决方案。
无论出于什么原因,安卓平板电脑都不会触发$.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只需足够小,就可以在醒来后的合理时间内启动。
我正在一个受控环境中运行这个应用程序,所以这可以正常工作,但我确信这不是理想的解决方案
发布于 2014-02-11 20:04:50
当设备从睡眠中返回时,下面的代码似乎是重新启动SignalR连接的正确方法:
$.connection.hub.disconnected( function () {
setTimeout( function () {
$.connection.hub.start();
}, 5000);
});为了您的目的,不需要更改ConnectionTimeout配置。长轮询传输几乎完全使用ConnectionTimeout来决定在结束当前投票和重新投票之前等待新消息的时间。这将默认为110秒,因为很多代理将在2分钟内杀死挂起的HTTP请求。
按照你的建议,把DisconnectTimeout提高到6小时绝对是过分的。这将导致服务器将丢失的连接保存在内存中6个小时。
如果您还没有读过,本文讨论SignalR的连接寿命应该提供更多的洞察力。
发布于 2014-06-19 13:27:31
在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);
});https://stackoverflow.com/questions/21711269
复制相似问题