2014-02-11 82 views
1

我有一个MVC 4应用程序,SignalR同时连接到许多Android平板电脑。当设备进入睡眠状态时,一些连接丢失,一些维持连接,看似没有任何模式。Android设备睡眠时SignalR连接丢失

我对视图下面的代码来尝试重新启动时断开连接:

$.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

我已经制定出一直在工作的解决方案。

无论出于何种原因,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必须小到足以在醒来后的合理时间内开火。

我跑在受控环境中,该应用程序,所以此工程好吧,但我敢肯定是不理想的解决方案

+0

看起来像一个可怕的想法。特别是因为你永远不会在服务器上提出断开连接(仅3小时后)。由于服务器没有清理连接,因此您可能容易泛滥,并且内存不足。 – davidfowl

+0

我同意,但正如我所说,这只会在受控的环境中运行,我确切知道将有多少连接存在。我当然更喜欢当他们从睡梦中回来时重新连接平板电脑,但没有解决方案,我发现将工作100%的时间 – cmarcum

+0

太棒了。如果你100%意识到了这些影响,那很好。 – davidfowl

3

从你的问题下面的代码似乎是去有关重新启动SignalR连接时,这些设备从睡眠回来的正确方法:

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

为ConnectionTimeout配置并不需要为目的而改变。 ConnectionTimeout几乎完全由长轮询传输使用,以决定在关闭当前轮询和回滚之前等待新消息的时间。默认为110秒,因为很多代理会在2分钟之前终止挂起的HTTP请求。

将DisconnectTimeout增加到6小时肯定是过度的,正如你所建议的那样。它会导致服务器在内存中保持连接6个小时。

This article on SignalR's connection lifetime如果您还没有阅读,应该提供更多的见解。

+0

谢谢,我读过的页面,一直没能找到任何解决方案呢。令人沮丧的是,我正在同时测试12台设备上的连接,有些会回来,其他则不会。每次都是不同的设备。 – cmarcum

+0

是$ .connection.hub.start();每五秒钟在不回来的设备上调用? – halter73

+0

我已经设置了一个警报,以便在setTimeout()函数内部触发,并且不会出现。据我所知,不回来的设备从不会听到hub.disconnected()事件。 – cmarcum

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