UserIdentifier,ConnectionId和SignalR Core中的组之间的区别

问题描述

我想了解ASP.NET Core SignalR中UserIdentifier,ConnectionId和Groups背后的原理吗?同一UserIdentifer(代表用户)是否可以具有多个signalR连接ID是不是真的?如果是这样,为什么要使用小组来建立联系?为什么不合并一个UserIdentifier下的连接?

解决方法

是不是同一UserIdentifer(代表用户)可以拥有 多个signalR连接ID?

是的,SignalR中的单个用户可以与一个应用建立多个连接。例如,用户可以在其台式机以及电话上进行连接。每个设备都有单独的SignalR连接,但是它们都与同一用户关联。

如果是的话,为什么要使用组将连接连接在一起?

组是与名称关联的连接的集合。消息可以发送到组中的所有连接,而每个连接可以与不同的用户关联。建议使用组来发送到一个或多个连接,因为组是由应用程序管理的。一个连接可以是多个组的成员。


为什么不合并一个UserIdentifier下的连接?

您可以通过使用集线器方法将用户标识符传递给User函数来向特定用户发送消息,如以下示例所示:

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

如果向用户发送了一条消息,则与该用户关联的所有连接都会收到该消息。可以通过集线器中的Context.UserIdentifier属性访问连接的用户标识符。

  • Clients.Client()
    在特定的已连接客户端上调用方法
  • Clients.User()
    在与特定用户关联的所有连接上调用方法
  • Clients.Group()
    在指定组中的所有连接上调用方法

Hub.Clients中还有更多方法。




SignalR非常灵活,并且可以根据需要提供许多选项。 您可以在此处找到有关users and groups in SignalR的更多详细信息。