2014-07-22 81 views
13

我目前正在開發一個使用SignalR(2.1)集線器的應用程序。SignalR:在C#客戶端檢測活連接

我有1個WPF客戶端,另一個是WCF客戶端。 一切工作正常,因爲他們完美地傳遞消息。

我現在唯一面臨的問題是,我注意到,當應用程序因爲自動重啓等原因而關閉時,OnDisconnected未被解僱,WCF服務器關閉以及其他一些問題。超時是30秒的默認值。即使過了1天,我也永遠不會打電話(我試過)。但是,超時適用於Web客戶端。

它只適用於我呼叫hub.connection.stop()。

但是,當客戶端是瀏覽器時,Ondisconnected方法非常有效。

因此,我想問一下Signal R Hub端是否有任何方法可以檢查客戶端是否仍然連接或已經退出(如ping)?

+1

1)你應該在github上爲.net信號客戶端提交一個bug(或者他們的alreday有錯誤?)。 2)您可以輕鬆實現自己的ping機制,在客戶端和集線器之間來回發送機制 –

+0

嗯,我通讀並注意到這個文本說 「如果您的Web服務器停止工作或應用程序重新啓動,則不會調用OnDisconnected方法。因此,您的數據存儲庫可能具有不再有效的連接ID記錄。在http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections。因此,我知道他們知道這件事。但是,我的問題是,是否有任何內置的方式讓SignalR集線器注意到連接是否已被丟棄,而不是每隔幾秒鐘就會ping通。 – Kiong

回答

23

在SignalR 2.1.0中,有一個new overload to OnDisconnected需要bool指示客戶端是否正常斷開連接。在2.1.0 release notes的「突破性變化」部分中解釋了此更改背後的原因。

您的新OnDisconnected方法可能是這個樣子:

public override Task OnDisconnected(bool stopCalled) 
{ 
    if (stopCalled) 
    { 
     // We know that Stop() was called on the client, 
     // and the connection shut down gracefully. 
    } 
    else 
    { 
     // This server hasn't heard from the client in the last ~35 seconds. 
     // If SignalR is behind a load balancer with scaleout configured, 
     // the client may still be connected to another SignalR server. 
    } 

    return base.OnDisconnected(stopCalled); 
} 

,這並不需要一個布爾舊OnDisconnected方法不要求非正常斷開,因此,如果您使用的是事件,那可以解釋你所看到的問題。

在2.1.0之前,調用了不帶參數的(唯一)OnDisconnected方法,用於優美非優雅斷開連接。由於這種行爲變化導致several reported issues,舊的OnDisconnected過載is being removed in SignalR's upcoming 2.1.1 release

這將導致使用SignalR的舊OnDisconnected方法的應用程序在針對SignalR 2.1.1構建時無法編譯。雖然這並不理想,但它有望使開發人員意識到這一重大變化,因此他們有機會在部署應用程序之前適當修改其應用程序。

+0

完美。我只是測試,是的。這是射擊。先生非常感謝您! – Kiong

+0

halter73,謝謝。我發現了一個小錯誤。 OnDisconnected方法不會觸發,如果我在下一行使用「虛擬」:公共虛擬任務OnDisconnected(布爾stopCalled)我使用「覆蓋」,而不是「虛擬」,它的工作原理。 –

+0

謝謝。我修復了我的答案。 – halter73

0

我發現我的客戶端不會重新連接,如果我強制服務器關閉連接。 (我會得到一個錯誤WSSockets)

所以,對我來說,修復是:

con = new HubConnection(_url); 
con.Error += (exception) => Error(exception); 
con.Start(); 

然後,在錯誤的方法,企圖再次調用上面的代碼重新連接。