2013-02-18 249 views
7

我使用SignalR在我app.I具有取決於一個很大的程度上OnDisconnected()正確調用的應用程序。而且它在下列情況下正確調用:SignalR斷開連接不會被調用互聯網上斷開/重新連接

public Task OnDisconnected() 
{ 
    try 
    { 
     DeleteUser(Context.ConnectionId); 
     return null; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 
  1. 用戶刷新頁面
  2. 用戶導航到一個新的頁面
  3. 用戶關閉瀏覽器

然而,如果網絡連接突然下降,它不會被調用。例如,如果我拔掉客戶端計算機上的網線,或者禁用客戶端的無線網絡,或者拔掉路由器,即使等待幾分鐘,OnDisconnected()也不會被調用。

+0

我還沒有與SignalR那麼多的工作了,但是我敢肯定它不是其functionallities之一檢查,如果用戶仍然連接到集線器。您可能想要實現自己的計時器,該計時器將在(x)分鐘後將用戶註銷。 – Timsen 2013-02-18 13:43:01

+0

就菲爾德在這個環節,它可能是有益的給你:http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 – Timsen 2013-02-18 14:12:51

回答

6

它會引發斷開,但不會立即。有一個可配置的閾值(默認爲30秒),SignalR將在它認爲客戶端斷開連接之前等待(在底層tcp連接消失之後並且不會立即)。如果連接在配置的超時之前斷開並重新連接,則不會引發OnDisconnected。

如果你從來沒有看到它被提出在某些情況下等待一段時間,那麼它可能是一個錯誤之後。 SignalR 1.0今天發佈,所以我鼓勵你也嘗試一下,看看你是否仍然看到問題。

+0

dfowler..i將使用信號r 1.0 OK,謝謝,我現在用的信號r 0.5.3 – user1527989 2013-02-19 05:01:25

+1

大衛,當我們在ASP.NET 4.5 + IIS 8.0下託管SignalR時,是否符合'HttpContext.Response.ClientDisconnectedToken'? – tugberk 2013-02-19 15:05:47

+2

我們不使用它,因爲它有一個錯誤。但是當它被修復時,我們會使用它。 – davidfowl 2013-02-19 17:44:07

2

這可能不是正確的答案,但是這是我知道的:

您將無法看到OnDisconnected事件猛然揮出當連接被丟棄,因爲SignalR不追查(它用於連接後臺任務的池以查看連接在特定時間間隔內是否死亡)。當你關閉瀏覽器時,我猜SignalR向服務器發送了一個請求來表示斷開事件的信號。這就是爲什麼你突然看到事件被解僱的原因。

但是,對於HttpContext.Response,ASP.NET 4.5有一個CancellationToken屬性,名爲ClientDisconnectedToken,當TCP連接被丟棄時,該屬性將發出信號。據我所知,這僅適用於IIS 8.0,我不確定SignalR是否可以在.NET 4.5 ASP.NET主機下使用它。