ASP.NET Core SignalR (六):在SignalR中管理用戶和分組


此為系列文章,對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的檢測到它,並將其從分組中移除。

      注意,分組名稱是大小寫敏感的。

相關資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM