Хотелось узнать количество подключений в SignalR Core Group

Как я могу получить количество подключений в определенной группе SignalR Core?

Что-то такое:

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

Было бы также хорошо, если бы SendAsync возвращал, сколько клиентов отправили сообщение:

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

Мне это нужно, чтобы определить, пуста ли группа. Данные должны быть верными, если пользователь с силой отключается от SignalR Core (отсоединяет сетевой кабель) ...


person Makla    schedule 17.10.2018    source источник


Ответы (1)


Вы можете использовать события OnConnected и OnDisconnected и сохранить connection / 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);
}
person pocki_c    schedule 17.10.2018
comment
Примечание: это не даст вам надежного подсчета, если у вас несколько серверов. Вот почему у нас нет встроенного способа сделать это. Если у вас несколько серверов, каждый из них знает только о соединениях на этом сервере. - person Andrew Stanton-Nurse; 18.10.2018
comment
Это правильно, но на самом деле я не видел простого способа узнать все связи. На самом деле нет ни встроенного решения, ни простого решения для многосерверных конфигураций. - person pocki_c; 20.10.2018
comment
@ AndrewStanton-Nurse У меня точно такая же ситуация, как вы упомянули, у меня есть балансировщик нагрузки, SignalR использует Redis для постоянных подключений, но мне все еще нужно сопоставить подключения с пользователями, что-то вроде: private static ConcurrentDictionary<string, ConnectionInfos> Как я могу это сделать? Нужно ли мне использовать Redis вручную, чтобы сохранить этот словарь? Могу ли я использовать встроенный механизм SignalR, который подключается к Redis, и вставлять этот словарь в данные, отправляемые в Redis? - person Nour; 02.01.2019
comment
@ AndrewStanton-Nurse, если это не работает для многосерверной среды env, как обстоят дела с Clients.All тогда обрабатываются? - person Roger Far; 11.01.2021