Io sono l'attuazione di una struttura di sessione.Come affrontare la sessione lasciata aperta
Ho un ConcurrentDictionary
sul lato server che tiene su tutte le coppie <SessionId, UserSession>
.
Quando viene stabilita una nuova connessione, un cookie viene assegnato a un browser client, perm o temp a seconda dell'opzione RememberMe
.
Quando i clienti chiamano la funzione LogOut
si toglie la sessione dal dizionario.
Tuttavia, quando il browser client viene semplicemente chiuso o arrestato in modo anomalo e il cookie è stato perso, scaduto o cancellato, l'oggetto sessione lato server in memoria è rimasto nel dizionario e diventa un fantasma. Col passare del tempo questi fantasmi si accumuleranno.
La mia domanda è, come migliorare la progettazione in modo che le sessioni di morti possono essere puliti dopo che sono scaduti?
ho pensato di fare un servizio timer l'esecuzione di un programma di pulizia, ma non si sente elegante. C'è un modo più semplice per farlo senza dipendere da un servizio esterno?
Sarebbe preferibile utilizzare una cache con un termine di laminazione, o gestire il metodo Session_End. Cosa stai memorizzando in UserSession? – zimdanen
Non esiste un metodo Session_End affidabile da gestire, se il browser del client si arresta in modo anomalo, finisce semplicemente lì senza tornare al server. Ma ora che hai citato un cache, ho avuto un'idea, posso memorizzare un elenco ordinato per il tempo LastActive. Ogni volta che un nuovo client esegue l'accesso, può aiutare a controllare la prima sessione in coda e rimuoverla se scaduta. Ogni utente attivo si metterà in coda alla coda quando chiama il server per fare qualcosa. Quindi, diventa l'ultima persona attiva. – Tom
A un certo punto, hai bisogno di vedere i dati di tutti quelli che hanno effettuato l'accesso? In caso contrario, perché non archiviare i dati in Session (se sono necessari i dati) e lasciarli scomparire al termine della sessione? Ciò gestirà anche la pressione della memoria eliminando gli elementi dalla sessione se c'è pressione. O utilizzare HttpContext.Cache con un timeout di rollover, quindi scomparirà dopo un intervallo di tempo dopo l'ultimo accesso. (Fondamentalmente, non è necessario eseguire il rollover.) – zimdanen