在其上下文中按 ID 查找 SignalR 客户端

Find SignalR client by ID in its context

所以我想通过 SignalR 向特定客户端发送消息。该客户端不是 Clients.Caller - 目前我只能通过我们称其为“ID”来识别它,上下文中的 属性:this.Context.Items["ID"]

因此,要通过 ID 查找客户端,我该如何...访问所有客户端或上下文?或者我应该以不同的方式保存这个 ID 吗?这不是连接 ID,它是映射到数据库中某些内容的 ID。

基本上我想去Clients.Single(c => c.Items["ID"] == specificId).SendMessage(msg);

您可以使用 context.Clients.User(...)context.Clients.All() 将 ID 发送给客户端。然后在 JavaScript 中读取 ID 并将其与页面上的内容进行比较。如果匹配,则执行一些操作;否则忽略。

例如,假设您的应用正在编辑屏幕上处理特定记录。记录 ID 在页面上作为表单字段。您使用 ID 从 C# 发送 SignalR 消息。您在 JavaScript 中对 ID 和表单字段值进行比较;如果它们匹配,则显示烤面包机消息,执行其他处理等。

在中心的 OnConnectedAsync 方法中,您可以在用户每次连接时按他们的“ID”对用户进行分组。

例如:

public async override Task OnConnectedAsync()
{
    var currentUserId = /*get your current users id here*/
    await Groups.AddToGroupAsync(Context.ConnectionId, $"user-{currentUserId}");
    await base.OnConnectedAsync();
}

然后当您需要向该人发送消息时,您可以将消息广播到他们的 'personal' 群组。 (一个人可能有多个连接,所以组方法非常适合我们)。

例如:

Clients.Group($"user-{userId}").SendAsync("UserSpecificMessage", message);

当用户断开连接时,SignalR 将自动处理从组中删除连接。

在使用这种方法时,我们不必不必要地向每个客户端广播一条消息,目的是只有一个客户端根据 id 过滤消息。