在 SignalR 中管理使用者及群組

作者:Brennan Conroy

SignalR 允許將訊息傳送至與特定使用者相關聯的所有連線,以及傳送至具名的連線群組。

檢視或下載範例程式碼(如何下載)

SignalR 中的使用者

SignalR 中的單一使用者可以有多個應用程式連線。 例如,使用者可以在電腦和手機上連線。 每個裝置都有個別 SignalR 的連線,但其都與相同的使用者相關聯。 如果將訊息傳送給使用者,則與該使用者相關聯的所有連線都會收到該訊息。 中樞中的 Context.UserIdentifier 屬性可以存取連線的使用者識別碼。

根據預設,SignalR 使用與連線相關聯之 ClaimsPrincipal 中的 ClaimTypes.NameIdentifier 作為使用者識別碼。 若要自訂此行為,請參閱使用宣告來自訂身分識別處理

如下列範例所示,將使用者識別碼傳遞至中樞方法中的 User 函式,以將訊息傳送給特定使用者:

注意

使用者識別碼會區分大小寫。

public Task SendPrivateMessage(string user, string message)
{
    return Clients.User(user).SendAsync("ReceiveMessage", message);
}

SignalR 中的群組

群組是與名稱相關聯的連線集合。 可以將訊息傳送至群組中的所有連線。 群組是傳送至一或多個連線的建議方式,因為群組是由此應用程式所管理。 連線可以是多個群組的成員。 群組是聊天應用程式這類應用程式的理想選擇,其中每個聊天室都可以透過群組表示。

將連線新增至群組中或從群組中移除

透過 AddToGroupAsyncRemoveFromGroupAsync 方法,將連線新增至群組中或從群組中移除:

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}.");
}

如果使用者已存在於群組中,則可以安全地將使用者多次新增至該群組中,而不會擲回任何例外狀況。

當連線重新連線時,不會保留群組成員資格。 重新建立連線時,連線必須重新加入群組。 無法計算群組的成員,因為如果將應用程式調整為多部伺服器,則無法使用此資訊。

群組會保留在記憶體中,因此它們不會透過伺服器重新啟動保留。 對於需要保留群組成員資格的場景,請考慮使用 Azure SignalR 服務。 如需詳細資訊,請參閱 Azure SignalR

若要在使用群組時保護資源的存取權,請在 ASP.NET Core 中使用驗證和授權功能。 如果只有在該群組的認證有效時,才會將使用者新增至群組,則傳送至該群組的訊息只會傳送給授權的使用者。 不過,群組不是安全性功能。 驗證宣告具有群組沒有的功能,例如到期和撤銷。 如果使用者存取群組的權限遭到撤銷,應用程式必須明確地將使用者從群組中移除。

注意

群組名稱會區分大小寫。

其他資源