2013-10-17 50 views
1

我有以下的Hub片段與SignalR,Redis背板和單個服務器一起工作。SignalR OnConnected與多個服務器和Redis背板

 
    public abstract class HubBase : Hub 
    { 
     private readonly static ConnectionMapping Connections = new ConnectionMapping(); 

     public override Task OnConnected() 
     { 
     Connections.Add(Context.User.Identity.Name, Context.ConnectionId); 
     return base.OnConnected(); 
     } 
    } 

我存儲的用戶連接到一個靜態變量,所以我可以的ConnectionId映射到用戶名和我能消息特定用戶以後。

我的問題是,OnConnected函數是否會在SignalR場中的所有服務器上調用?我測試了它,並從外觀上看,它只在客戶端連接的服務器上被調用。

如果它沒有在所有服務器上調用,那麼處理這種情況的建議方法是什麼?

編輯:思考這個現在我意識到我的示例代碼可能有一個嚴重的缺陷。如果在另一臺服務器上也調用了OnConnected方法,那麼顯然Context.User.Identity.Name將不會被設置,因爲沒有請求隨呼叫一起發送。我想解決這個問題的唯一方法就是使用組。

+0

你好我有一個類似的問題 - 我期待在連接,組的狀態和Redis的背板之間的關係。 David Fowler指出signalR是無狀態的,所以我擔心這是我需要跟蹤/存儲/廣播自己的東西... – penderi

+1

您必須將Redis中的Connections對象存儲在Redis中,因此所有服務器都可以訪問相同的列表 – Julien

回答

0

有一種方法可以做到這一點,但由於penderi說signalr是無狀態的,所以不能保證特定用戶仍然連接。我不確定Redis,但SQL服務器底板使用IMessageBus,並且它會將所有消息存儲在本地緩存中,如果用戶斷開連接,則IMessageBus進程將發送自用戶斷開連接後所有廣播的消息。需要注意的是,緩存只保存消息很長時間。

這裏是一個數據庫實現鏈接映射用戶將他們的connectionIds

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections#database