2012-09-02 165 views
7

Hy,SignalR - 處理斷開連接的用戶

我在項目中使用signalR庫來處理通知和聊天模塊。我有一個數據庫的表格來跟蹤在線用戶。

用於聊天的HUB正在繼承IDisconnect,我斷開用戶的連接。在斷開用戶連接之後,我會爲用戶介紹該事件。在這一點上,我檢查斷開用戶是否是客戶端。如果是這樣,那麼我在HUB上調用一個方法來重新連接用戶(只需更新表)。

我這樣做是因爲在當前實現中,一旦用戶關閉瀏覽器上的選項卡,它會調用Disconnect任務,但他可以打開另一個選項卡。

我還沒有測試(與更大的請求)此模塊,但在我的開發服務器上,它可能需要幾秒之間的IDisconnect事件和用戶請求再次連接。

我很關心我的實現處理斷開的用戶聊天,但我看不到另一種方式來改善這一點。

如果可能的話,有人可以給我一個這方面的建議,或者這是我唯一的解決方案嗎?

更新:我結束了使用單例類來存儲來自signalr的所有用戶及其連接id。這樣,我可以在斷開連接任務期間從用戶處獲取id(此時,您沒有任何httpcontext來獲取用戶信息,但是您始終可以通過單身數組中的signalr連接標識獲取用戶標識類)。

20-02-2013雖然上述解決方案是在做這項工作,但我需要擴展我的項目。我的解決方案是使用Redis存儲所有用戶連接,並利用斷開連接事件的密鑰到期時間。在重新連接期間,我檢查密鑰是否處於未決狀態(將在幾分鐘內過期)。

+0

一年後,我發現FB Tornado使用Python構建,並遵循非阻塞模式,我說過再見SignalR;) –

回答

5

你可以看看如何JabbR,建立在SignalR之上的多房間聊天應用,解決了這個問題:https://github.com/JabbR/JabbR/blob/master/JabbR/Hubs/Chat.cs

它基本上保持了1:用戶< N個映射 - > ConnectionId之外,所以當上次連接斷開後,用戶可以被標記爲「脫機」。

+0

非常感謝,該項目非常有用。我將遵循超時方法 –

+0

您可以將任何「JabbR ...如何解決此問題」內聯到您的答案中嗎? –

+0

@MichaelPaulukonis它基本上保持ConnectionId用戶的1:N映射,所以當最後一次連接斷開時,用戶可以被標記爲「脫機」。 –

相關問題