2012-04-02 15 views
7

Ecco il mio problema, voglio monitorare se l'utente è online o offline e informare gli altri clienti su di esso. Sto usando gli hub e implementato sia le interfacce IConnected che IDisconnect.C'è un modo per ottenere il numero di connessioni nel gruppo di hub Signalr?

La mia idea era di inviare una notifica a tutti i client quando l'hub rileva la connessione o la disconnessione. Per impostazione predefinita, quando l'utente aggiorna la pagina otterrà un nuovo ID di connessione e alla fine la connessione precedente chiamerà disconnect notificando che gli altri client sono offline anche se è effettivamente online.

Ho provato a utilizzare il proprio ID di restituzione ConnectionIdFactory per l'ID di connessione ma con più schede aperte a un certo punto rileverà la connessione utente disconnessa e dopo quell'hub lato client tenterà di connettersi all'hub senza esito in loop infinito sprecando memoria e cpu che rende il browser quasi inutilizzabile. Avevo bisogno di aggiustarlo velocemente così ho rimosso la mia fabbrica e ora aggiungo ogni nuova connessione al gruppo usando il nome utente, così posso facilmente notificare all'utente singolo su tutte le connessioni, ma poi ho il problema di scoprire se l'utente è online o offline come non so quanti utenti di connessioni attive stanno avendo.

Quindi mi chiedo se c'è un modo per ottenere il numero di connessioni in un gruppo? O se qualcuno ha qualche idea migliore su come tracciare quando l'utente va offline?

sto usando Signalr 0,4

+0

È possibile utilizzare un dizionario > in cui la chiave è il nome utente e hashset contiene le connessioni id (s) per tale utente. numero di utenti = Keys.Count(), # of connections = dict.Values.Sum (x => x.Count()); – drch

+0

Il sito dovrebbe funzionare nello scenario di Web farm, quindi non posso usare Dizionario. Potrei memorizzare le connessioni in db, ma vorrei evitarlo se possibile. – pajo

+0

Quando si dice che l'utente aggiorna la pagina e ottiene un nuovo ID di connessione, sto memorizzando l'ID di connessione nel mio DB e se l'utente visualizza due pagine sul mio sito dove è lo stesso hub anche l'ID di connessione è lo stesso. Perché ricevi un ID di connessione separato. Penso che puoi ottenere ID diversi solo quando il cliente è diverso. –

risposta

9

Non c'è modo per fare questo altro che contare sul proprio.

3

trovato il modo di soluzione:

Rewrite connectionId, così in ogni scheda si avrebbe lo stesso sonnection ID:

public class MyConnectionFactory : IConnectionIdGenerator 
    { 
     public string GenerateConnectionId(IRequest request) 
     { 
      return MyUserManager.Instance.CurrentUserID.ToString(); 
     } 
    } 

Aggiungi al Global.asax:

GlobalHost.DependencyResolver.Register(typeof(IConnectionIdGenerator),() => new MyConnectionFactory()); 

E Sono riuscito ad aprire le schede di Mach, come potevo. E tutte le schede ottengono le notifiche.

+0

Non funziona con l'ultima versione di Signalr. – kravits88

+0

potresti dare un codice completo per capire come implementare ConnectionFactory che è nuovo a signalr. Grazie – Mou

Problemi correlati