2013-01-03 31 views
6

由於各種原因,建立SignalR連接時,我將該ConnectionId存儲在我的數據存儲中。但是,如果SignalR重新啓動,那些連接記錄可能會成爲孤立的。 (我也觀察到行爲,讓我懷疑OnDisconnected()是否正確調用,雖然我不太確定這一點。)鑑於SignalR ConnectionId,我可以告訴該會話是否仍然連接?

但是,無論出於何種原因,我會定期結束記錄在我的數據庫中孤兒,我希望能夠修剪這些,並刪除任何實際連接不上的ConnectionID - 大概是通過讓SignalR告訴我這個ConnectionID是否仍然與實時會話相關聯。

我已經看過了SignalR的源代碼,它並沒有向我跳出如何最好地實現這一點。有沒有合理的方法來做到這一點?

回答

4

完成此操作的方法是自行跟蹤客戶。從您的帖子看來,您似乎已經在執行此操作(如果不是,則仍提供代碼),但這是瞭解客戶端是否已連接的唯一方法。 SignalR服務器觸發連接/斷開連接的事件,以指示客戶端是否連接。

我建議確保您不重新實例化數據庫中的記錄,但不正確地重新連接。

例如(超簡單的例子):

class myHub 
{ 
    private static List<String> _connectedClients = new List<String>(); 

    public override Task OnConnected() 
    { 
     _connectedClients.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     _connectedClients.Remove(Context.ConnectionId); 
     return base.OnDisconnected(); 
    } 

    public static bool IsConnected(string cid) 
    { 
     return _connectedClients.Contains(cid); 
    } 
} 

您現在可以調用IsConnected在輪轂上,以確定是否連接ID當前連接。

+0

這基本上是我現在正在做的,但它似乎沒有正常工作。也許98%的時間,但每隔一段時間,我會關閉我的開發機器上的所有瀏覽器,然後當我回到我的房間時,它會相信我的版本中仍然有某些東西'_connectedClients',即使一切都應該已被清除。儘管如此,我沒有這方面的報道,所以對你們來說幫助不大。我會告訴你,如果我能弄清楚是什麼觸發它 - 或者如果(也許更可能)它是我身邊的錯誤。 –

+0

@N。 Taylor Mullen爲什麼你最後一次void返回bool值? –

+0

@aliyouhannaei沒有理由,只是一個失敗的代碼片段。只是更新了它。 –

-1

在DB中存儲connectionId不是好方法。 SignalR將爲每個頁面分配一個新的ID。試試這個sample of Kevin W. Griffin

0

它也發生在我身上,我不時發現一個孤立的連接。

作爲工作的時候,我增加了一個客戶端功能,$(窗口).unload它調用服務器端的函數,它應該做的事..

希望它可以幫助什麼斷開。

相關問題