首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓设备休眠时SignalR连接丢失

安卓设备休眠时SignalR连接丢失
EN

Stack Overflow用户
提问于 2014-02-11 19:30:20
回答 3查看 5.4K关注 0票数 3

我有一个与SignalR同时连接到许多安卓平板电脑的MVC 4应用程序。当设备进入睡眠状态时,一些连接丢失,而一些连接被维护,似乎没有模式。

视图上有以下代码试图在断开连接时重新启动连接:

代码语言:javascript
复制
    $.connection.hub.disconnected( function () {
        setTimeout( function () {
            $.connection.hub.start();
        }, 5000);
    });

在Application_Start()方法中还有以下行:

代码语言:javascript
复制
    GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromHours( 6 );
    GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromHours( 6 );

据我所知,6小时是多余的,这只是为了确保连接不会在测试期间超时。

我还设置了平板电脑,以便在睡眠期间保持Wi连接。

然而,当平板电脑进入睡眠状态后,几分钟后就会醒来,一些连接将仍然处于活动状态,而其他连接则不会。

如何确保当设备从睡眠中恢复时,SignalR连接将被维护或重新启动?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-13 22:20:55

我已经想出了一个行之有效的解决方案。

无论出于什么原因,安卓平板电脑都不会触发$.connection.hub.disconnected()函数。

在Application_Start()方法中设置以下值解决了问题

代码语言:javascript
复制
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromHours( 3 );
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromHours( 3 );
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds( 10 );

这些值设置得非常大,但我必须让DisconnectTimeout和ConnectionTimeout都大于设备休眠的时间。KeepAlive只需足够小,就可以在醒来后的合理时间内启动。

我正在一个受控环境中运行这个应用程序,所以这可以正常工作,但我确信这不是理想的解决方案

票数 -1
EN

Stack Overflow用户

发布于 2014-02-11 20:04:50

当设备从睡眠中返回时,下面的代码似乎是重新启动SignalR连接的正确方法:

代码语言:javascript
复制
$.connection.hub.disconnected( function () {
    setTimeout( function () {
        $.connection.hub.start();
    }, 5000);
});

为了您的目的,不需要更改ConnectionTimeout配置。长轮询传输几乎完全使用ConnectionTimeout来决定在结束当前投票和重新投票之前等待新消息的时间。这将默认为110秒,因为很多代理将在2分钟内杀死挂起的HTTP请求。

按照你的建议,把DisconnectTimeout提高到6小时绝对是过分的。这将导致服务器将丢失的连接保存在内存中6个小时。

如果您还没有读过,本文讨论SignalR的连接寿命应该提供更多的洞察力。

票数 4
EN

Stack Overflow用户

发布于 2014-06-19 13:27:31

在SignalR (版本2.0.1及更低版本)中有一个错误,当断开连接事件在客户端连接一次后触发时,状态保持为连接或连接(https://github.com/SignalR/SignalR/issues/2554 -在2.0.2版本中解决)。

您可以通过在超时中触发重新启动来绕过这个问题:

代码语言:javascript
复制
$.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);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21711269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档