2012-08-09 26 views
2

我在我正在寫的應用程序使用Signalr並存儲在併發字典中的所有的用戶連接SignalR Disconections

ConcurrentDictionary<string, User> _users = new ConcurrentDictionary<string, User>(); 

例如 https://github.com/SignalR/SignalR/blob/master/samples/SignalR.Hosting.AspNet.Samples/Hubs/ShapeShare/ShapeShare.cs

我已經實現了我的樞紐的IDisconnect界面,我從詞典中刪除用戶,當他們斷開

我想知道如何可靠Disconnect方法真的是? 它是否捕捉到用戶可以分離的所有不同方式? 我不想字典成長和無限增長

我在想也許有一個計時器定期遍歷字典和刪除誰還沒有過任何近期的活動

這是必要的用戶?我可以依靠斷開連接方法嗎?

回答

1

退房https://github.com/SignalR/SignalR/wiki/Configuring-SignalR,也有設置:

DisconnectTimeout 保持活動 & Heatbeat間隔

這些可能都被應用在維護你的字典來幫忙。

根據我的經驗,優雅的斷開似乎在signalR上工作得很好(仍然有win-apps的問題),如果它在幾分鐘內非連接斷開,連接將超時,斷開方法會觸發並從字典中移除德魯說。

您可以創建一個方法,將消息發送給所有客戶端並記錄返回的連接ID,然後刪除任何舊的條目,但實際上斷開連接方法確實工作/工作本身,我只實現心跳如果你真的需要密切關注連接的話。

1

如果它不啓動它是一個錯誤,你應該report an issue to the SignalR project on GitHubHere's a list of open issues with Disconnects

請注意差異。運輸有差異。斷開檢測邏輯等,根據用戶使用的傳輸方式,你會看到差異。 Disconnect發生火災時的模式,但它最終會發射所有的運輸工具。

+0

即使應用程序池已被回收,它是否會斷開連接?我的問題是知道何時使我的緩存無效。快速應用程序池不應使緩存無效。但是,如果服務器停機時間超過DisconnectTimeout KeepAlive時間間隔,則緩存應該不再有效。 – RedFilter 2013-10-01 16:00:23