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

Posted

技术标签:

【中文标题】在其上下文中按 ID 查找 SignalR 客户端【英文标题】:Find SignalR client by ID in its context 【发布时间】:2021-12-11 16:04:09 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

在中心的 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();

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

例如:

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

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

在使用这种方法时,我们不必为了让一个客户端根据 id 过滤掉消息而不必要地向每个客户端广播消息。

【讨论】:

效果很好,谢谢!【参考方案2】:

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

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

【讨论】:

以上是关于在其上下文中按 ID 查找 SignalR 客户端的主要内容,如果未能解决你的问题,请参考以下文章

SignalR 2.2 客户端未收到任何消息

在 JSF 中按 ID 查找组件

猫鼬查询:在数组中按 id 查找对象

在 JavaScript 对象数组中按 id 查找对象

在深层嵌套对象中按特定键查找所有值

我可以使用 SignalR 在所有客户端上触发 AJAX 请求吗?