Qual è la differenza tra Session.Abandon () e Session.Clear ()


109

Qual è la differenza tra la distruzione di una sessione e la rimozione dei suoi valori? Puoi fornire un esempio che lo dimostri?

Ho cercato questa domanda, ma non afferrare la risposta totale. Alcune risposte sono:

  • Session.Abandon() distrugge la sessione
  • Session.Clear() rimuove solo tutti i valori

Un amico mi ha detto questo:

La cancellazione della sessione non annullerà la sessione, esiste ancora con lo stesso ID per l'utente ma con i valori semplicemente cancellati.

L'abbandono distruggerà completamente la sessione, il che significa che è necessario iniziare una nuova sessione prima di poter memorizzare altri valori nella sessione per quell'utente.

Il codice seguente funziona e non genera eccezioni.

Session.Abandon();
Session["tempKey1"] = "tempValue1";

Quando abbandoni () una sessione, tu (o meglio l'utente) riceverai un nuovo SessionId

Quando provo la sessione, non apporta alcuna modifica quando abbandono la sessione.

Trovo solo una differenza: session.Abandon()genera Session_Endeventi


5
Session.Clear rimuove gli elementi immediatamente ma Session.Abandon contrassegna la sessione da abbandonare alla fine della richiesta corrente.
RepDbg

Risposte:


148

Cancella : rimuove tutte le chiavi e i valori dalla raccolta dello stato della sessione.

Abbandona : rimuove tutti gli oggetti archiviati in una sessione. Se non si chiama esplicitamente il metodo Abandon, il server rimuove questi oggetti e distrugge la sessione quando la sessione scade.
Genera anche eventi come Session_End .

Session.Clear può essere paragonato alla rimozione di tutti i libri dallo scaffale , mentre Session.Abandon è più come buttare via l'intero scaffale .

Tu dici:

Quando provo la sessione, non apporta alcuna modifica quando abbandono la sessione.

Questo è corretto mentre lo fai all'interno di una sola richiesta .
Alla prossima richiesta la sessione sarà diversa. Ma l' ID sessione può essere riutilizzato in modo che l'ID rimanga lo stesso.

Se utilizzerai Session.Clear avrai la stessa sessione in molte richieste.

In genere, nella maggior parte dei casi è necessario utilizzare Session.Clear.
Puoi usare Session.Abandon se sei sicuro che l'utente lascerà il tuo sito.

Quindi torniamo alle differenze:

  1. Abandon solleva la richiesta Session_End.
  2. Clear rimuove gli oggetti immediatamente, Abandon no.
  3. Abandon rilascia l'oggetto SessionState e i suoi elementi in modo che possa eseguire la garbage collection per liberare le risorse. Clear mantiene SessionState e le risorse ad esso associate.

e se chiamo session.clear () questo lo dici di nuovo accures. non? (tutto il resto aumenta l'evento Session_End)
backdoor

Session.Clear rimuoverà solo gli elementi dalla sessione. Niente di più. Puoi chiamarlo tutte le volte che è necessario.
Dmytrii Nagirniak

@AnthonyWJones, hai ragione "distruggere" non è corretto da dire. È meglio RIMUOVERE gli oggetti dalla sessione. Ma anche Session.Clear non distrugge gli oggetti, li rimuove dalla sessione in modo che possano essere raccolti in modo indesiderato. Inoltre, non è consigliabile conservare oggetti COMPLESSI, altrimenti lo considero bene.
Dmytrii Nagirniak

@Dmitriy: Perché "la memorizzazione di oggetti COMPLEX non è consigliata"?
Kamarey

5
@Ads sono d'accordo, anche se lo estenderei dicendo che Session.Clearpuò essere paragonato alla rimozione immediata di tutti i libri dallo scaffale , mentre Session.Abandonè più come dire "butta via l'intero scaffale e fammi sapere quando hai finito ".
WynandB

20

Quando fai Abandon()una sessione, tu (o meglio l'utente) riceverai un nuovo SessionId (alla richiesta successiva). Quando si Clear()esegue una sessione, tutti i valori memorizzati vengono rimossi, ma il SessionId rimane intatto.


3
Grazie. ma accroding a mattew macdonalds book può utilizzare lo stesso ID di sessione. significa che se l'attributo rigenerateExpiredSessionId nell'elemento configuration / system.web / sessionState nel file web.config è falso, ASP.Net utilizza il vecchio ID sessione
backdoor

2
@ Hans Kesting Non riceverà un nuovo ID sessione quando viene chiamato l'abbandono. Deve impostare esplicitamente il cookie ASPNET_SessionID su null per ottenere un nuovo ID sessione.
Zo ha il

9

Questo è un po ' coperto dalle varie risposte sopra, ma la prima volta che ho letto questo articolo mi sono perso un fatto importante, che ha portato a un bug minore nel mio codice ...

Session.Clear() CANCELLERÀ i valori di tutte le chiavi ma NON causerà l'attivazione dell'evento di fine sessione.

Session.Abandon()NON cancellerà i valori sulla richiesta corrente. SE viene richiesta un'altra pagina, i valori verranno persi per quella. Tuttavia, abbandonare genererà l'evento.

Quindi, nel mio caso (e forse nel tuo?), Avevo bisogno di Clear()seguito da Abandon().


1
Perché avresti bisogno di Session.Clear () seguito da Session.Abandon ()? Stai cancellando i valori di una collezione che stai distruggendo? Questo è completamente ridondante. Sicuramente l'oggetto sessione non viene immediatamente distrutto (ciò accade alla fine della richiesta corrente), ma quell'id sessione non sarà più servito da nessuna richiesta successiva. Se il cliente effettua una nuova richiesta, gli verrà assegnata una nuova sessione. Chiamare prima Clear causerà anche problemi se si desidera accedere a qualsiasi variabile di sessione nell'evento Session_End () di Global.Asax (non saranno presenti perché sono state cancellate).
RepDbg

@ RepDbg in realtà non sono d'accordo. Session.Abandon (). fornisce al cliente un nuovo ID di sessione. Session.clear cancella tutte le informazioni sul server sulla sessione in modo che nessun altro utente possa farlo. Sono d'accordo con NRC
Micah Armantrout

@ Micah Armantrout Non sto seguendo la tua logica. Perché cancellare una sessione con Session.Clear (), quindi chiamare Session.Abandon () che non solo cancella la sessione, ma la dealloca completamente? Inoltre Session.Abandon () non fornisce al client un nuovo ID di sessione. Una richiesta successiva sarà, ma non l'adempimento della richiesta che ha chiamato Session.Abandon ().
RepDbg

Se usi solo Session.Abandon, l'altra logica rimanente nella pipeline ASP.NET può ancora accedere ai valori della sessione corrente.
Mark Sowul

6

questo codice funziona e non genera alcuna eccezione:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

È perché quando viene chiamato il metodo Abandon, l'oggetto Session corrente viene accodato per l'eliminazione ma non viene effettivamente eliminato finché tutti i comandi di script sulla pagina corrente non sono stati elaborati. Ciò significa che è possibile accedere alle variabili memorizzate nell'oggetto Session sulla stessa pagina della chiamata al metodo Abandon ma non in alcuna pagina Web successiva.

Ad esempio, nello script seguente, la terza riga stampa il valore Mary. Questo perché l'oggetto Session non viene eliminato finché il server non ha terminato l'elaborazione dello script.

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

Se si accede alla variabile MyName in una pagina Web successiva, è vuota. Questo perché MyName è stato eliminato con l'oggetto Session precedente quando la pagina contenente l'esempio precedente ha terminato l'elaborazione.

da MSDN Session.Abandon


3

La cancellazione di una sessione rimuove i valori che erano memorizzati lì, ma è comunque possibile aggiungerne di nuovi lì. Dopo aver distrutto la sessione non è possibile aggiungere nuovi valori lì.


grazie ma funziona: (incoerente con la tua idea) Session.Abandon (); Session ["tempKey1"] = "tempValue1"; Response.Write (Session [ "tempKey1"] ToString ().);
backdoor il

Lo fa perché la sessione verrà distrutta dopo aver aggiornato effettivamente la pagina. ID di sessione (solitamente) memorizzato in un cookie.
RaYell

Non capisco. Voglio dire, dopo aver chiamato Session.Abandon () ancora posso aggiungere valori ad esso. (anche se la pagina viene postata indietro e viene nuovamente renderizzata).
backdoor il

1
Potresti aver impostato la sessione per generare automaticamente l'ID dopo che è stato distrutto. Quindi, quando si assegna un valore a una sessione distrutta, verrà generata automaticamente una nuova sessione.
RaYell

1
sì, l'utilizzo di questo ID di sessione si rigenererà, ma la mia domanda è: cosa c'è di diverso tra session.clear () e session.abandone (). in questo modo quando l'autoregenerate è impostato su false questi rimorchi non differiscono in nient'altro sollevando Sesion_End?
backdoor il

3

cancella: rimuove la chiave o i valori dalla raccolta dello stato della sessione.

abbandona gli oggetti di sessione rimossi o eliminati dalla sessione.


1
Session.Abandon() 

distruggerà / ucciderà l'intera sessione.

Session.Clear()

rimuove / cancella i dati della sessione (cioè le chiavi e i valori della sessione corrente) ma la sessione sarà attiva.

Confronta con il metodo Session.Abandon (), Session.Clear () non crea la nuova sessione, ma rende semplicemente NULL tutte le variabili nella sessione.

L'ID di sessione rimarrà lo stesso in entrambi i casi, a condizione che il browser non venga chiuso.

Session.RemoveAll()

Rimuove tutte le chiavi e i valori dalla raccolta dello stato della sessione.

Session.Remove()

Elimina un elemento dalla raccolta dello stato della sessione.

Session.RemoveAt()

Elimina un elemento in un indice specificato dalla raccolta dello stato della sessione.

Session.TimeOut()

Questa proprietà specifica il periodo di timeout assegnato all'oggetto Session per l'applicazione. (il tempo sarà specificato in minuti).

Se l'utente non aggiorna o non richiede una pagina entro il periodo di timeout, la sessione termina.



0

Penso che sarebbe utile usare Session.Clear()piuttosto che usare Session.Abandon().

Perché i valori esistono ancora nella sessione dopo la chiamata successiva, ma vengono rimossi dopo aver chiamato il primo.


0
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

Una cosa da notare qui che Session.Clear rimuove immediatamente gli elementi ma Session.Abandon contrassegna la sessione da abbandonare alla fine della richiesta corrente. Ciò significa semplicemente che supponiamo che tu abbia provato ad accedere al valore nel codice subito dopo che il comando session.abandon è stato eseguito, sarà ancora lì. Quindi non ti confondere se il tuo codice non funziona anche dopo aver emesso il comando session.abandon e aver eseguito immediatamente un po 'di logica con la sessione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.