2015-07-14 9 views
9

Jak mogę uzyskać listę otwartych połączeń z SignalR bez wysyłania im "ping" lub ręcznego rejestrowania ich na własną listę?Lista otwartych połączeń w SignalR?

AKTUALIZACJA: Lub po prostu uzyskać liczbę klientów, do których wiadomość została wysłana z koncentratora. Chcę wiedzieć, na ilu odpowiedzi powinienem czekać (bez czekania na całkowity czas oczekiwania).

(Ponieważ SignalR nie obsługuje wartości zwracanych podczas rozmowy klientów z koncentratora, jestem zbieranie wyniki według innej wiadomości, że klienci są wysyłającym do piasty.)

Wyjaśnienie: Zakładam SignalR musi wiedzieć, aby które połączenia wysyła wiadomość.

+1

Nie sądzę, że możesz. –

Odpowiedz

1

Nie znalazłem jeszcze żadnego bezpośredniego sposobu na zrobienie tego.

Najlepsze, co do tej pory znalazłem, to skorzystanie z samouczka - USERS BY CONNECTIONS IN SIGNALR, możesz znaleźć więcej kodu w odnośniku, uprościłem go, aby uzyskać podstawowe zrozumienie.

public void Register(HubClientPayload payload, string connectionId) 
{  
    lock (_lock) 
    { 
     List<String> connections; 
     if (_registeredClients.TryGetValue(payload.UniqueID, out connections)) 
     { 
      if (!connections.Any(connection => connectionID == connection)) 
      { 
       connections.Add(connectionId); 
      } 
     } 
     else 
     { 
      _registeredClients[payload.UniqueID] = new List<string> { connectionId }; 
     } 
    }   
} 

i

public Task Disconnect(string connectionId) 
{  
    lock (_lock) 
    { 
     var connections = _registeredClients.FirstOrDefault(c => c.Value.Any(connection => connection == connectionId));  
     // if we are tracking a client with this connection remove it 
     if (!CollectionUtil.IsNullOrEmpty(connections.Value)) 
     { 
      connections.Value.Remove(connectionId);  
      // if there are no connections for the client, remove the client from the tracking dictionary 
      if (CollectionUtil.IsNullOrEmpty(connections.Value)) 
      { 
       _registeredClients.Remove(connections.Key); 
      } 
     }     
    return null; 
} 

również

public Task Reconnect(string connectionId) 
{ 
    Context.Clients[connectionId].reRegister();  
    return null; 
} 
2

można przechowywać identyfikator użytkownika onConnected i usunąć go odłączyć. Zobacz to tylko przykład przy użyciu bazy danych, aby utrzymywać podłączone identyfikatory

protected Task OnConnected(IRequest request, string connectionId){ 
    var context=new dbContext(); 
    context.Connections.Add(connectionId); 
    context.Save(); 
    } 
    protected Task OnDisconnected(IRequest request, string connectionId){   
    var context=new dbContext(); 
    var id=context.Connections.FirstOrDefault(e=>e.connectionId==connectionId); 
    context.Connections.Remove(id); 
    context.Save(); 
    } 

wtedy wszędzie trzeba otworzyć listę podłączonych identyfikatorów, należy poprosić o db.

+2

potrzebujesz również po ponownym połączeniu – CMS

Powiązane problemy