当android设备休眠时,SignalR连接丢失

时间:2014-02-11 19:30:20

标签: android asp.net-mvc-4 google-chrome signalr

我有一个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连接?

3 个答案:

答案 0 :(得分:3)

当您的设备从睡眠状态恢复时,您的问题中的以下代码似乎是重启SignalR连接的正确方法:

$.connection.hub.disconnected( function () {
    setTimeout( function () {
        $.connection.hub.start();
    }, 5000);
});

不需要为了您的目的更改ConnectionTimeout配置。 ConnectionTimeout几乎完全由长轮询传输使用,以决定在关闭当前轮询和重新关联之前等待新消息的时间。默认为110秒,因为许多代理将在2分钟内终止待处理的HTTP请求。

根据您的建议,将DisconnectTimeout提升至6小时肯定是过度的。它将导致服务器在内存中保持丢失连接六个小时。

如果您还没有阅读过,

This article on SignalR's connection lifetime应提供更多见解。

答案 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);
});