2014-02-11 79 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); 
});