在 SignalR 中管理使用者及群組
SignalR 允許將訊息傳送至與特定使用者相關聯的所有連線,以及傳送至具名的連線群組。
檢視或下載範例程式碼 \(英文\) (如何下載)
SignalR 中的使用者
SignalR 中的單一使用者可以有多個應用程式連線。 例如,使用者可以在電腦和手機上連線。 每個裝置都有個別 SignalR 的連線,但其都與相同的使用者相關聯。 如果將訊息傳送給使用者,則與該使用者相關聯的所有連線都會收到該訊息。 中樞中的 Context.UserIdentifier
屬性可以存取連線的使用者識別碼。
根據預設,SignalR 使用與連線相關聯之 ClaimTypes.NameIdentifier
中的 ClaimsPrincipal
作為使用者識別碼。 若要自定義此行為,請參閱 使用宣告來客製化身分識別的處理。
如下列範例所示,將使用者識別碼傳遞至中樞方法中的 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}.");
}
如果使用者已存在於群組中,則可以安全地將使用者多次新增至該群組中,而不會擲回任何例外狀況。
當連線重新連線時,不會保留群組成員資格。 重新建立連線時,連線必須重新加入群組。 無法計算群組的成員,因為如果將應用程式調整為多部伺服器,則無法使用此資訊。
群組會保留在記憶體中,因此它們不會透過伺服器重新啟動保留。 對於需要保留群組成員資格的場景,請考慮使用 Azure SignalR 服務。 如需詳細資訊,請參閱 Azure SignalR
若要在使用群組時保護資源的存取權,請在 ASP.NET Core 中使用驗證和授權功能。 如果只有在該群組的認證有效時,才會將使用者新增至群組,則傳送至該群組的訊息只會傳送給授權的使用者。 不過,群組不是安全性功能。 驗證宣告具有群組沒有的功能,例如到期和撤銷。 如果使用者存取群組的權限遭到撤銷,應用程式必須明確地將使用者從群組中移除。
注意
群組名稱會區分大小寫。