2009-03-07 9 views
10

Sto lavorando all'applicazione di chat, ho usato HashTable per contenere User e Operator come chiave & Oggetto della classe ChatRoom come valore di HashTable. Il problema principale è che quando l'utente o l'operatore chiudono il browser o si disconnettono senza disconnettersi, si disconnettono automaticamente alla fine della sessione.Come gestire la fine della sessione in global.asax?

Please help me related to that e come utilizzare Global.asax in questa materia.

risposta

14

Aggiungi un file Global.asax al tuo sito web e, nell'evento Session_End, rimuovi l'utente dal tuo HashTable.

protected void Session_End(Object sender, EventArgs e) 
{ 
    // Remove user from HashTable 
} 
+0

Nella mia tabella hash contiene chiave, che è anche Session ["UserID"] contiene, Questa sessione viene utilizzata per passare il parametro usrid di Logout (stringa usrid), in evento Session_End, Se avete qualche idea allora per favore aiutatemi ... –

+2

Non capisco la tua domanda. Scusate. – MartinHN

24

È possibile utilizzare evento fine della sessione di global.asax per rimuovere l'utente in modo imprevisto disconnesso:

void Session_End(Object sender, EventArgs E) { 
    // Clean up session resources 
} 

ma attenzione, la sessione non si conclude quando l'utente chiude il suo browser o la sua connessione persa. Termina quando viene raggiunto il timeout della sessione.

+0

Se apporto modifiche nel mio file Web.config per Session TimeOut, Funziona? –

+0

no, è possibile ridurre il timeout della sessione, ma ha effetto su tutta l'applicazione in modo inaspettato. Forse puoi impostare un controllo programmatico sulla tua applicazione di chat. per esempio, se un utente non intraprende alcuna azione per 5 minuti, puoi supporre che sia disconnesso. – Canavar

+2

Il commento di @ ashishbhatt è corretto per me. È possibile ridurre molto il timeout della sessione (ovvero 1 minuto) ma ** quindi è necessario assicurarsi che ** almeno una chiamata AJAX non operativa venga eseguita continuamente come battito cardiaco (o keep-alive). Questo è solo un trucco, e non dovrebbe ridimensionare a milioni di utenti –

6

L'evento Session_End non si attiva quando il browser è chiuso, si attiva quando il server non ha ricevuto una richiesta dall'utente in una specifica sessione temporale (per impostazione predefinita 20 minuti). Ciò significa che se usi Session_End per rimuovere gli utenti, rimarranno nella chat per 20 minuti dopo aver chiuso il browser.

Suggerisco di mantenere l'ora dell'ultima richiesta nell'oggetto utente. In questo modo puoi determinare quanto è attivo l'utente e quanto è probabile che l'utente abbia lasciato la chat. Ad esempio, puoi visualizzare qualsiasi utente che non ha fatto nulla per due minuti come inattivo.

È inoltre possibile consentire all'applicazione di chat di eseguire periodicamente il polling del server (se non lo si fa già). Ciò aggiornerebbe l'ultima richiesta di tempo nell'oggetto e manterrà l'utente attivo fintanto che la finestra di chat è aperta.

È possibile utilizzare l'evento onunload nel browser per inviare una richiesta di disconnessione al server quando l'utente lascia la pagina. Questo ovviamente funziona solo se l'utente ha ancora la connettività di rete. L'evento onunload viene attivato anche quando si ricarica la pagina, quindi è necessario tenere traccia del motivo per cui l'evento viene attivato per utilizzarlo.

+1

grazie Guffa, Se ho usato l'evento onunload, chiameremo Leave() ma in quel problema principale è quando aggiorno il pulsante quindi chiamerà Leave() , Gestisco F5, AlterF4, clic destro sul corpo, ma come può gestire il pulsante Aggiorna cliccato su tutto il browser? Se hai qualche idea, per favore aiutami. –

1

È possibile JavaScript che viene sempre eseguito sul client e invia un segnale al server come "Sono qui". Se il segnale successivo non arriva, puoi chiamare Leave();. Ho usato con AJAX per farlo.

Problemi correlati