2013-01-03 2 views
6

Per svariati motivi, quando viene stabilita una connessione SignalR, sto memorizzando tale ConnectionId nel mio datastore. Tuttavia, tali record di connessione possono essere resi orfani, ad esempio, se SignalR viene riavviato. (Ho anche osservato un comportamento che mi fa chiedere se OnDisconnected() viene chiamato correttamente, anche se sono meno sicuro di ciò.)Dato un ConnectionR di segnale, posso sapere se quella sessione è ancora connessa?

Ma per qualsiasi motivo, periodicamente finisco con i record nel mio database che sono orfano, e mi piacerebbe essere in grado di sfoltire quelli e rimuovere qualsiasi ConnectionID elencato che non sia effettivamente connesso più - presumibilmente facendo in modo che SignalR mi dica se questo ConnectionID è ancora associato a una sessione live.

Ho guardato attraverso la sorgente SignalR, e non mi sta saltando addosso il modo migliore per farlo. C'è un modo ragionevole per farlo?

risposta

4

Il modo per ottenere questo risultato è tenere traccia dei clienti da soli. Dal tuo post sembra che lo stiate già facendo (codice ancora fornito nel caso in cui non lo sia) ma questo è l'unico modo per sapere se un client è connesso. Il server SignalR attiva gli eventi onconnected/ondisconnected in modo da indicare se un client è o non è connesso.

Si consiglia di verificare che i record non ancora istanziati nel database vengano ricollegati in modo errato.

Per esempio (super semplice esempio):

class myHub 
{ 
    private static List<String> _connectedClients = new List<String>(); 

    public override Task OnConnected() 
    { 
     _connectedClients.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     _connectedClients.Remove(Context.ConnectionId); 
     return base.OnDisconnected(); 
    } 

    public static bool IsConnected(string cid) 
    { 
     return _connectedClients.Contains(cid); 
    } 
} 

Ora è possibile chiamare IsConnected sul mozzo per determinare se un ID di connessione è attualmente collegato.

+0

Questo è fondamentalmente quello che sto facendo ora, ma non sembra funzionare correttamente. Forse il 98% delle volte lo fa, ma ogni tanto chiudo tutti i miei browser sulla mia macchina dev, e poi quando torno nella mia stanza, sarà convinto che c'è ancora qualcosa nella mia versione di '_connectedClients', anche se tutto dovrebbe essere stato cancellato. Però non ho una riproduzione, quindi non è di grande aiuto per voi ragazzi. Ti farò sapere se riesco a capire cosa lo scatena, o se (forse più probabilmente) è un bug dalla mia parte. –

+0

@N. Taylor Mullen perché il tuo ultimo annullamento restituisce il valore bool ?? –

+0

@aliyouhannaei nessun motivo, solo uno snippet di codice di errore. L'ho appena aggiornato. –

-1

Memorizzare la connessione in DB non è il modo migliore. SignalR assegnerà un nuovo ID per ogni pagina. Prova questo sample of Kevin W. Griffin

0

Succede anche a me, di volta in volta rilevo una connessione orfana.

Come un lavoro in giro, ho aggiunto una funzione di unload lato client, $ (window) che invoca una funzione lato server che fa quello che si suppone di disconnessione da fare ..

Speranza che aiuta.