管理 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 中的身份验证和授权功能。 如果仅当凭据对组有效时才将用户添加到该组,则发送到该组的消息将仅发送给授权用户。 但是,组不是一项安全功能。 身份验证声明具有组不具备的功能,例如到期和吊销。 如果撤销用户对组的访问权限,应用必须从组中显式删除该用户。

注意

组名称区分大小写。

其他资源