【问题标题】:Hot to get count of connection in SignalR Core Group热门获取 SignalR 核心组中的连接数
【发布时间】:2018-10-17 09:01:23
【问题描述】:

如何获取特定 SignalR Core 组中的连接数?

类似的东西:

this.Clients.Group("Something").Count();

如果SendAsync 能返回多少个客户端发送消息也很好:

var count = await this.Clients.Client(this.Context.ConnectionId).SendAsync("msg", msg);

我需要这个来确定组是否为空。如果用户强行断开 SignalR Core 的连接(拔下网线),数据应该是正确的...

【问题讨论】:

    标签: signalr asp.net-core-signalr


    【解决方案1】:

    您可以使用 OnConnected 和 OnDisconnected 事件并保存连接/connectionIds。

    我使用类似这样的东西来提供额外的信息:

    internal static ConcurrentDictionary<string, ConnectionInfos> Users = new ConcurrentDictionary<string, ConnectionInfos>();
    
    public override async Task OnConnectedAsync()
    {
        var connId = Context.ConnectionId;
        if (!Users.Keys.Any(x => x == connId))
        {
            Users.TryAdd(connId, new ConnectionInfos { /*...*/});
        }
        await base.OnConnectedAsync();
    }
    
    public override async Task OnDisconnectedAsync(Exception exception)
    {
        var id = Context.ConnectionId;
        if (Users.TryRemove(id, out ConnectionInfos ci))
        {
            //Connection removed
        }
        await base.OnDisconnectedAsync(exception);
    }
    

    【讨论】:

    • 注意:如果您有多个服务器,这不会为您提供可靠的计数。这就是为什么我们不提供内置的方法来做到这一点。当您有多个服务器时,每个服务器只知道该服务器上的连接。
    • 没错,但实际上我还没有看到任何简单的方法来了解所有连接。实际上,对于多服务器配置,没有内置解决方案,也没有简单的解决方案。
    • @AndrewStanton-Nurse 我有你提到的确切情况,我有一个负载均衡器,SignalR 使用 Redis 来持久连接,但我仍然必须将连接映射到用户,类似于:@ 987654322@我该怎么做?我必须手动使用 Redis 来保存这本字典吗?我可以利用连接到 Redis 的内置 SignalR 机制,并将该字典注入发送到 Redis 的数据中吗?
    • @AndrewStanton-Nurse 如果这不适用于多服务器环境,那么 Clients.All 是如何处理的?
    猜你喜欢
    • 2018-07-01
    • 2019-06-30
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2015-11-29
    • 1970-01-01
    相关资源
    最近更新 更多