Domanda

In ASP.NET, sto cercando un modo per controllare un utente che lascia la mia applicazione. Per essere precisi, vorrei inserire un record di "logout" in una tabella di controllo in SQL Server quando la sessione dell'utente viene abbandonata / distrutta per qualsiasi motivo (non necessariamente a causa di una chiamata a session.abandon)

Ho una classe 'SessionHelper' che gestisce i setter / getter della sessione.

Ho provato a postare di nuovo in Session_End in Global.asax, ma non ha mai generato questo evento anche dopo la scadenza del timeout.

Ho provato a sovrascrivere 'finalizza' nella classe SessionHelper e farlo lì quando la classe viene distrutta, ma non ha nemmeno generato quell'evento.

Proverei a implementare IDisposable in SessionHelper, ma non so dove chiamarlo in modo che venga sempre chiamato.

Qual è il modo corretto di controllare un utente che lascia l'applicazione ASP.NET?

Grazie!

È stato utile?

Soluzione

L'evento Session_End viene generato solo se si hanno sessioni InProc. La gestione della sessione del server SQL o dello stato non genererà questo evento. Se puoi, torna alle sessioni InProc e usa questo evento.

A parte questo, non otterrai ottime soluzioni. ASP.NET non offre un modo per esaminare l'elenco corrente di sessioni sul server (almeno, nessun modo che gli utenti di StackOverflow conoscono, dal momento che ho già posto la domanda), quindi non è possibile utilizzare un lavoro per controlla quando vengono distrutti.

La prossima cosa migliore sarebbe avere un "ultimo tempo di accesso" memorizzato da qualche parte per i tuoi utenti e utilizzalo per rilevare un timeout della sessione. L'implementazione di un simile lavoro è complicata (ad esempio, è possibile perdere gli eventi di disconnessione se un utente accede / disconnette rapidamente) ...

Quindi nessuna soluzione perfetta qui.

Altri suggerimenti

Nota sul modo "corretto". ma ecco come l'ho fatto in passato.

Avere un " è attivo " timbro data-ora associato al record utente nel database. Ogni volta che l'utente accede a una pagina, che viene aggiornata all'ora corrente. Se qualcuno non ha effettuato l'accesso alla pagina in diciamo 15 minuti, quell'utente viene registrato come " logout " evento e il timestamp è impostato su NULL.

Nella migliore delle ipotesi il tuo record di logout sarà un'ipotesi intelligente, anche se riuscirai a far funzionare correttamente gli eventi della sessione, di quando l'utente ha lasciato il tuo sito / app. Una tecnica che potresti usare è quella di inserire il tempo di logout nel db quando l'utente accede e continuare ad aggiornare il record con un tempo futuro mentre usano il sistema. Ecco lo schema generale di una tabella di sessioni che ho usato di recente:

[Id]  [Uid]    [LoginInOn]        [ExpiresOn]  
 1    johndoe  10/14/2008 10:47   10/14/2008 11:07  

In questa tabella continuo ad aggiornare la colonna ExpiresOn mentre l'utente interagisce con l'applicazione (ora corrente + 20 minuti). Se provano a interagire dopo ExpiresOn, allora so che sono rimasti inattivi per 20 minuti e hanno forzato un nuovo accesso. A fini di reportistica, so che l'utente si è disconnesso se l'ora corrente è maggiore di ExpiresOn. Puoi diventare più complesso di così. Ad esempio, trasferisco i miei dati dalla tabella delle sessioni sopra elencata in una tabella di report con un processo regolare. Questo serve solo a mantenere piccola la tabella delle sessioni, poiché molte cose interagiscono con essa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top