2012-05-15 17 views
6

Come faccio ad avere i clienti connectionId/ClientID esterno del mozzo .. Sono riuscito a fare quanto segue:Get connectionId al di fuori di Hub, SignalR

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

Ma in quel contesto-oggetto non c'è come un clientId.

risposta

4

È possibile implementare IConnected/IDisconnect sull'Hub e tenere traccia manualmente dei client, ad esempio in un database, quindi richiamare l'elenco quando richiesto. L'esempio che segue è dal SignalR Wiki

public class Status : Hub, IDisconnect, IConnected 
{ 
    public Task Disconnect() 
    { 
     return Clients.leave(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Connect() 
    { 
     return Clients.joined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Reconnect(IEnumerable<string> groups) 
    { 
     return Clients.rejoined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 
} 
4

Perché ci sarebbe un ID di connessione sul contesto globale? A quale connessione farebbe riferimento? Quando si ottiene il contesto globale, si accede a un canale a senso unico da server a client e si possono inviare messaggi su di esso. Non hai accesso all'ID di connessione dell'hub poiché non stai chiamando in esso. Puoi salvarli da qualche parte nella tua applicazione se devi usarli.

+2

Non tutti creano server di chat. Penso implicitamente era come ottenere il ConnectionId utilizzato dal client corrente in modo che un messaggio possa essere inviato solo a quell'utente/sessione. Mi chiedo come fare al meglio in un MVC Action da un client in cui voglio inviare messaggi di progresso. Esistono alcune tecniche per la caching di ConnectionIds tramite il nome utente, ma non ho visto nulla di decente per consentire allo stesso utente di avere più connessioni, che è spesso il caso delle app web. Idee per questo? Grazie. – Dave

+4

Lo si invia dal client all'azione mvc. È disponibile sul client tramite $ .connection.hub.id. – davidfowl

1

Ecco la soluzione. È possibile richiamare un metodo all'interno di hub ed è possibile restituire il connection ID da lì.

controller

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
MyHub _connectedHub= new MyHub(); 
var connectedUserID = _connectedHub.GetConnectionID(); 

In Hub

public string GetConnectionID() 
{ 
    return "Your Connection ID as String" //This can be stored in a list or retrieved in any other method 
} 

Avrete ID al di fuori del centro da indicare solo nel connectedUserID variabile. Spero che questo aiuti.

Problemi correlati