2015-02-23 389 views
2

出於某種原因,SignalR將在短時間後停止調用客戶端方法(我估計大約需要1小時或更少)。我有一個顯示警報的頁面...一個非常簡單的實現。下面是使用Javascript:SignalR在一段時間後停止工作

$(function() { 

    // enable logging for debugging 
    $.connection.hub.logging = true; 

    // Declare a proxy to reference the hub. 
    var hub = $.connection.alertHub; 

    hub.client.addAlert = function (id, title, url, dateTime) { 
     console.log(title); 
    }; 

    $.connection.hub.start().done(function() { 
     console.log("Alert Ready"); 
    }); 
}); 

如果我刷新頁面,它再次工作了大約一個小時,然後將停止在調用客戶端事件addAlert。日誌中沒有錯誤,沒有警告。在日誌中的最後一個事件(比坪到服務器的其他)爲:

[15點十八分58秒GMT-0600(CST)] SignalR:在輪轂觸發客戶機轂事件 'addAlert' 'AlertHub' 。

很多這些事件會進入一段時間,然後停止,即使服務器仍然應該發送它們。

我在Mac和SignalR 2.0.0上使用Firefox 35.0.1。

我意識到解決方法是強制每10分鐘刷新一次頁面,但我正在尋找解決問題根本原因的方法。

我在服務器上啓用了SignalR跟蹤。在Alert頁面全新更新並且警報通過後,我在服務器上創建了一個「警報」。我等了大約10分鐘,我又試了一次,但未能通過。這裏的日誌讀什麼(遺憾的冗長,不知道什麼是有關):

SignalR.Transports.TransportHeartBeat Information: 0 : Connection b8b21c4c-22b4-4686-9098-cb72c904d4c9 is New. 
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9) 
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9) 
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9) 
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9) 

有幾十更多SignalR.Transports.TransportHeartBeat的消息,但沒有別的。

+1

您是否在服務器端的集線器中設置了日誌,以查看客戶端在停止的活動之前是否斷開連接? – 2015-02-24 13:37:16

+0

我沒有。我會這樣做併發布結果。謝謝。 – 2015-02-24 13:51:29

+0

除了日誌。你使用什麼交通工具?你是否在經歷代理?如果是這樣,你有沒有嘗試過使用https? – Pawel 2015-02-24 18:22:42

回答

0

事實證明,問題是我在處理AlertHub連接的方式。我正在使用企業庫緩存來存儲支持AlertHub的連接,並且在創建完20分鐘後我即將過期緩存條目。 Ergo,當服務器調用客戶端方法時,沒有錯誤報告,因爲沒有客戶端發送消息。

我已經將緩存過期增加到一個合理的值,從而解決了問題。

+0

你可以發佈你的代碼/文件嗎?我想我有同樣的問題。多謝。 – toddmo 2015-04-11 22:40:19

0

如果客戶端處於非活動狀態,沒有鼠標移動(大約每隔15-30分鐘),則可以刷新頁面。我有同樣的問題,並解決這個問題。這是討厭的解決方法,但後來我忘了它,並從來沒有完全修復;)

+0

這是一個破解不是一個解決方案 – Anders 2015-02-24 10:06:32

+0

任何想法的根本原因? – 2015-02-24 11:43:39

+0

@RandonBoy,您是否使用SignalR的自定義依賴解析器? – 2015-02-26 22:31:28

0

我認爲theres信號的默認110秒超時。你可以嘗試signalr斷開的事件重新連接回來。

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

而在startHub()中,您可以重新開始連接。

參考:https://github.com/SignalR/SignalR/issues/3128

How to use SignalR events to keep connection alive in the right way?

+0

我會給你一個鏡頭併發布結果。謝謝。 – 2015-02-24 13:56:57

+1

110秒超時僅用於長輪詢請求,以防止代理破壞長時間運行的HTTP請求。輪詢請求將在110秒後關閉,並且將創建一個新的輪詢請求,這不會導致重新連接/斷開連接,因爲這是輪詢的工作時間。此超時不適用於其他傳輸(好吧,我不知道永遠幀傳輸) – Pawel 2015-02-24 18:21:27

+0

任何進展?我現在很好奇。正如賈森所說的那樣,應用程序池回收會影響到這一點 – 2015-02-26 05:22:12

相關問題