在其上下文中按 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 客户端的主要内容,如果未能解决你的问题,请参考以下文章