共用方式為


在 SignalR 中管理使用者及群組

作者:Brennan Conroy

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

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

SignalR 中的使用者

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

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

如下列範例所示,將使用者識別碼傳遞至中樞方法中的 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 中使用驗證和授權功能。 如果只有在該群組的認證有效時,才會將使用者新增至群組,則傳送至該群組的訊息只會傳送給授權的使用者。 不過,群組不是安全性功能。 驗證宣告具有群組沒有的功能,例如到期和撤銷。 如果使用者存取群組的權限遭到撤銷,應用程式必須明確地將使用者從群組中移除。

注意

群組名稱會區分大小寫。

其他資源