2014-09-21 2 views
4

В клиенте OnConnected клиент добавляется в группу с его именем (группа содержит весь идентификатор клиента), тогда его имя добавляется в список, если оно не существует.Проверка наличия группы в группе SignalR?

static List<string> onlineClients = new List<string>(); // list of clients names 

public override Task OnConnected() 
{ 
    Groups.Add(Context.ConnectionId, Context.User.Identity.Name); 

    if (!onlineClients.Exists(x => x == Context.User.Identity.Name)) 
    { 
     onlineClients.Add(Context.User.Identity.Name); 
    } 

    return base.OnConnected(); 
} 

В методе OnDisconnected я пытаюсь проверить, пуста ли группа, чтобы удалить элемент из списка. Но после удаления последнего соединения группа не равна нулю.

public override Task OnDisconnected(bool stopCalled) 
{ 
    if (stopCalled) 
    { 
     // We know that Stop() was called on the client, 
     // and the connection shut down gracefully. 

     Groups.Remove(Context.ConnectionId, Context.User.Identity.Name); 

     if (Clients.Group(Context.User.Identity.Name) == null) 
     { 
      onlineClients.Remove(Context.User.Identity.Name); 
     } 

    } 
    return base.OnDisconnected(stopCalled); 
} 

Могу ли я проверить пустую группу?

+0

вопрос непонятен, что такое 'Группы' типа? –

+1

SignalR не предоставляет никаких API-интерфейсов для запроса, имеет ли группа активных клиентов. Нет ничего, что мешает вам отслеживать это вручную в OnConencted и OnDisconnected. – halter73

ответ

2

Я думаю, что это будет немного поздно ответить на ваш вопрос, может быть, вы уже забыли: d

Я решил мою проблему следующим образом с использованием словаря, который содержит имя группы (Пользователь.Идентичность.Имя) и его номера клиентов.

private static Dictionary<string, int> onlineClientCounts = new Dictionary<string, int>(); 

public override Task OnConnected() 
{ 
    var IdentityName = Context.User.Identity.Name; 
    Groups.Add(Context.ConnectionId, IdentityName); 

    int count = 0; 
    if (onlineClientCounts.TryGetValue(IdentityName, out count)) 
     onlineClientCounts[IdentityName] = count + 1;//increment client number 
    else 
     onlineClientCounts.Add(IdentityName, 1);// add group and set its client number to 1 

    return base.OnConnected(); 
} 

public override Task OnDisconnected(bool stopCalled) 
{ 
    var IdentityName = Context.User.Identity.Name; 
    Groups.Remove(Context.ConnectionId, IdentityName); 

    int count = 0; 
    if (onlineClientCounts.TryGetValue(IdentityName, out count)) 
    { 
     if (count == 1)//if group contains only 1client 
      onlineClientCounts.Remove(IdentityName); 
     else 
      onlineClientCounts[IdentityName] = count - 1; 
    } 

    return base.OnDisconnected(stopCalled); 
} 
Смежные вопросы