2015-08-28 89 views
11

我正在與SignalR在非常具體的網絡條件下(一個瘋狂的代理)。所以套接字不工作,我必須使用長輪詢。當我刷新頁面時,它似乎工作了一段時間,但是第一次斷開連接發生。我試圖斷開連接的情況下自動重新連接和下面的模式:SignalR奇怪的重新連接模式

  1. 頁面後加載,在110秒左右樞紐斷開(默認超時)
  2. 它需要3個斷開事件後重新啓動集線器第一次斷開連接(所以它只連接第四次嘗試)
  3. 之後,它總是在第一次嘗試時重新連接,但在大約10-15秒(而不是110秒)後斷開連接。所以它看起來像保持活躍超時在這裏(儘管它不是第一次嘗試)。

這種行爲看起來很奇怪。我能做些什麼來改善它嗎?

+0

你能具體談談您的網絡條件? –

+0

@BrendanGreen,它是一個帶有一些代理(Webwasher)的企業網絡,並且有很多東西被封鎖(這是一個德國企業網絡,你知道...) – SiberianGuy

+0

@BrendanGreen,你見過http:// www .asp.net/signalr/overview/guide-to-the-api/handling-connection-lifetime-events? SignalR的連接行爲是'未定義的',您可以在短時間內觀察到許多斷開連接和重新連接,而沒有明顯的原因。該頁面還提供瞭如何更改行爲的指導,例如設置'GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110);' – gd73

回答

2

假設Understanding and Handling Connection Lifetime Events in SignalR中的提示可用於您根據網絡問題使用良好解決方案來處理連接壽命。此外,在SignalR的問題中,我找到了適合您的以下解決方案,它也適用於長輪詢。

您可以設置在ConfigurationManagerKeepAlive財產和SignalR將在指定的時間間隔發送數據的空架(基於運輸),以保持連接(看Allow host to specify keep alive times)。目前的超時機制使得流協議沒有什麼不同。

+0

似乎默認啓用KeepAlive – SiberianGuy

+0

@Idsa對於長以外的傳輸輪詢,每隔10秒發送一次「keepalive」數據包。該值不得超過DisconnectTimeout值的1/3。 –

2

使用ConnectionStatusStream。當客戶端SignalR集線器代理事件發生時,此OnNexts流。所以我們看到像連接,連接,ConnectionSlow,重新連接,重新連接,關閉,未初始化。所有這些都在SignalR集線器代理上作爲事件開始生命,並且使用衆多RX工廠之一轉換爲IObservable流。在這種情況下IObservable.FromEvent。

無論如何,這裏是我們用來顯示應用底部狀態欄信息的整體ConnectivityStatusViewModel。

參見本:

ConnectionStatusStream

+0

我已經查看了代碼。雖然這是一個很好的架構(雖然從未與RX一起工作過),但我不明白它是如何解決我描述的問題的 – SiberianGuy