【问题标题】:Find SignalR client by ID in its context在其上下文中按 ID 查找 SignalR 客户端
【发布时间】: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);

【问题讨论】:

    标签: c# .net signalr signalr-hub .net-6.0


    【解决方案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 和表单字段值进行比较;如果它们匹配,您将显示一条烤面包机消息,执行其他处理等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多