此為系列文章,對MSDN ASP.NET Core SignalR 的官方文檔進行系統學習與翻譯。其中或許會添加本人對 ASP.NET Core 的淺顯理解。
SignalR 允許消息被發送給關聯給特定用戶的所有連接,以及命名的連接分組。
SignalR中的用戶
SignalR 允許你將消息發送給關聯給特定用戶的所有連接。默認情況下,SignalR使用與連接關聯的來自於ClaimsPrincipal
的ClaimTypes.NameIdentifier作為用戶標識。對於一個SignalR app 來說,一個單獨的用戶可以具有多個連接。比如,一個用戶可以在其桌面上被連接,也可以在他的iPhone上連接。每一個設備都有一個獨立的連接。但是它們都關聯到一個相同的用戶。如果消息被發送給這個用戶,那么所有關聯到這個用戶的連接都會收到這個消息。可以通過你的 Hub 類的Context.UserIdentifier 屬性來獲取到這個連接的用戶標識。
通過將用戶標識傳遞給你的 Hub 類中的 User 函數來給特定的用戶發送消息,如下示例所示:
注意,用戶標識是大小寫敏感的。
public Task SendPrivateMessage(string user, string message) { return Clients.User(user).SendAsync("ReceiveMessage", message); }
SignalR中的分組
一個分組是關聯到一個名稱的連接的集合。消息可以被發送給一個分組中的所有連接。如果要發送給一個或者多個連接,分組是我們推薦的方式,這是因為分組是被應用程序管理的。一個連接可以是多個分組的成員。這使得分組對於像聊天程序這樣的情形來說,是理想的選擇,在這種情形下,每個聊天室都表示為一個分組。通過 AddToGroupAsync 和 RemoveFromGroupAsync 方法,連接可以被添加到一個分組,或者從一個分組中移除。
public async Task AddToGroup(string groupName) { await Groups.AddToGroupAsync(Context.ConnectionId, groupName); await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}."); } public async Task RemoveFromGroup(string groupName) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName); await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}."); }
當一個連接重連時,分組成員不會被保存。當一個連接被重新建立時,它需要再次加入分組。要對分組的成員進行計數是不可能的,這是因為如果應用程序被擴展到多個服務器,此信息是不可用的。
在使用分組時,為了保護對資源的訪問,可以使用 ASP.NET Core 的 authentication and authorization 功能。當用戶憑證對於分組是有效的時,如果你僅添加用戶到分組中,那么發送給這個分組的消息僅僅會發送到授權用戶。然而,分組並不是一個安全的特性。驗證聲明具有分組所不具有的特性,比如過期,撤銷。如果一個用戶對分組的訪問許可被撤銷了,你需要手動2的檢測到它,並將其從分組中移除。
注意,分組名稱是大小寫敏感的。
相關資源