2015-07-14 5 views
9

Wie kann ich eine Liste der geöffneten Verbindungen von SignalR bekommen, ohne ihnen einen "Ping" zu schicken oder manuell in der eigenen Liste zu registrieren?Liste der geöffneten Verbindungen in SignalR?

UPDATE: Oder um nur die Anzahl der Clients zu erhalten, an die eine Nachricht von einem Hub gesendet wurde. Ich möchte wissen, auf wie viele Antworten ich warten soll (ohne das ganze Timeout abzuwarten).

(Da ist SignalR nicht Rückgabewerte stützen, wenn Kunden von einem Hub aufrufen, ich Ergebnisse durch eine andere Nachricht sammle die Kunden an den Hub senden.)

KLARSTELLUNG: Ich gehe davon aus SignalR wissen müssen welche Verbindungen sendet eine Nachricht.

+1

Ich glaube nicht, dass Sie können. –

Antwort

1

Ich habe noch keinen direkten Weg gefunden, dies zu tun.

Das Beste, was ich bis jetzt gekommen bin, folgt dem Tutorial - USERS BY CONNECTIONS IN SIGNALR, Sie können mehr Code in der Verbindung finden, ich habe es für grundlegendes Verständnis vereinfacht.

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 }; 
     } 
    }   
} 

und

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; 
} 

auch,

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

Sie können Benutzer-ID onConnected speichern und auf disconnect entfernen. Siehe dies ist nur ein Beispiel eine Datenbank mit den angeschlossenen ids

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(); 
    } 

dann bestehen bleiben, wohin man die Liste der angeschlossenen IDs zugreifen müssen, Sie fordern Sie Ihre db.

+2

müssen Sie auch erneut verbinden – CMS