2012-02-17 129 views
26

我已經看到如何通過綁定到.disconnect事件來在SignalR客戶端捕獲斷開連接事件。SignalR:檢測客戶端的連接狀態

現在我已經完成了這個工作,我想讓客戶端進入一個「等待重新連接的循環」,它不斷嘗試連接,直到成功或用戶取消。中心是否公開連接狀態屬性?我在想像(僞代碼)

var isConnected; 

function onConnected() { isConnected = true; } 

hub.disconnect = function() { while(hub.notconnected) { connect(); } 

回答

46

JS客戶端嘗試重新連接一段時間,默認爲110秒。您可以訂閱connection.stateChanged事件,並獲取有關狀態更改的更新,以便您可以將其顯示給用戶,或驗證SignalR對不同斷開連接情況的響應。

在我的測試中,狀態已正確更新爲斷開連接並重新連接等,如您所料。

More information on signalr connections

function connectionStateChanged(state) { 
    var stateConversion = {0: 'connecting', 1: 'connected', 2: 'reconnecting', 4: 'disconnected'}; 
    console.log('SignalR state changed from: ' + stateConversion[state.oldState] 
    + ' to: ' + stateConversion[state.newState]); 
} 

connection = $.connection(signalR_Endpoint); 
connection.stateChanged(connectionStateChanged); 
connection.start({ waitForPageLoad: false }); 
+7

我不認爲這是完全正確的。如果我失去了連接到我的服務器,它最終會放棄嘗試重新連接,並強迫我手動重新啓動連接。我不會說它總是試圖重新連接。 – KingOfHypocrites 2014-05-01 11:53:25

+2

請注意,可能的狀態在'$ .signalR.connectionState'上枚舉,例如'$ .signalR.connectionState.connected'。您可以看到'stateChanged' [here]的當前用法(https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client#connectionstatechanged-handlerchange-) – 2014-06-26 15:31:49

+0

查看客戶端[code](https: //github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Client.JS/jquery.signalR.transports.longPolling.js),我沒有找到任何可能會停止的條件一段時間後重新連接。但是,有一個退避計算會導致失敗的重新連接嘗試之間的時間越來越長,直到連接成功。所以我相信,只要頁面JS在瀏覽器中處於活動狀態,它就會試圖「永遠」重新連接。 – Mazrick 2014-09-09 14:06:22

8

客戶端總是嘗試連接。你不必擔心這一點。如果您想在連接成功重新建立時執行某些操作,則可以收聽重新連接的事件。

編輯:這改變了,客戶端只嘗試在一段時間內重新連接。之後,您必須捕捉斷開連接事件並手動重新啓動。

+0

有什麼特別的,我需要做來實現重新連接?看來我沒有得到斷開或重新連接事件觸發。目前我在做:$ .connection.hub.disconnect = onDisconnected; $ .connection.hub.reconnect = onReconnected;在客戶端上,並在集線器上實施了IDisconnect。 – Heather 2012-02-20 20:54:54

+0

@Jon IDisconnect接口用於服務器端事件,它工作正常(確保您使用的是SignalR 0.4)。在客戶端,Disconnect事件永遠不會被觸發,因爲SignalR永遠不能確定你是否斷開連接(這在未來我可能會改變)。重新連接應該工作,但我沒有測試它,所以我不能幫你。 – nmat 2012-02-21 23:38:28

+1

我發現如果c#客戶端斷開連接狀態,它不會重新連接。我必須重做hubConnection.Start()。Wait(); (我不知道這是否是一種好的做法!)我的場景是一臺機器上的控制檯應用程序與另一臺機器上的網站交談。如果我清理/重建網站,我們將通過重新連接,斷開連接並且不會恢復,除非我手動強制它。 – Andiih 2014-06-17 16:15:38