¿Cuál es la diferencia entre Session.Abandon () y Session.Clear ()

109

¿Cuál es la diferencia entre destruir una sesión y eliminar sus valores? ¿Puede proporcionar un ejemplo que demuestre esto?

Busqué esta pregunta, pero no capto la respuesta total. Algunas respuestas son:

  • Session.Abandon() destruye la sesión
  • Session.Clear() solo elimina todos los valores

Un amigo me dijo esto:

Borrar la sesión no anulará la sesión, todavía existe con el mismo ID para el usuario pero con los valores simplemente borrados.

El abandono destruirá la sesión por completo, lo que significa que debe comenzar una nueva sesión antes de poder almacenar más valores en la sesión para ese usuario.

El siguiente código funciona y no arroja ninguna excepción.

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

Cuando abandona () una sesión, usted (o más bien el usuario) obtendrá un nuevo SessionId

Cuando pruebo la sesión, no hace ningún cambio cuando abandono la sesión.

Solo encuentro una diferencia: session.Abandon()sube el Session_Endevento

puerta trasera
fuente
5
Session.Clear elimina elementos inmediatamente, pero Session.Abandon marca la sesión como abandonada al final de la solicitud actual.
RepDbg

Respuestas:

147

Borrar : elimina todas las claves y valores de la colección de estado de sesión.

Abandonar : elimina todos los objetos almacenados en una sesión. Si no llama al método Abandon explícitamente, el servidor elimina estos objetos y destruye la sesión cuando se agota el tiempo de espera.
También genera eventos como Session_End .

Session.Clear se puede comparar con quitar todos los libros del estante , mientras que Session.Abandon es más como tirar todo el estante .

Tu dices:

Cuando pruebo la sesión, no hace ningún cambio cuando abandono la sesión.

Esto es correcto mientras lo hace dentro de una sola solicitud .
En la próxima solicitud, la sesión será diferente. Pero la identificación de sesión se puede reutilizar para que la identificación siga siendo la misma.

Si va a utilizar Session.Clear, tendrá la misma sesión en muchas solicitudes.

Generalmente, en la mayoría de los casos es necesario utilizar Session.Clear.
Puede utilizar Session.Abandon si está seguro de que el usuario abandonará su sitio.

Así que volvamos a las diferencias:

  1. Abandon genera la solicitud Session_End.
  2. Clear elimina elementos de inmediato, Abandon no.
  3. Abandon libera el objeto SessionState y sus elementos para que pueda recolectarse basura para liberar los recursos. Clear mantiene SessionState y los recursos asociados a él.
Dmytrii Nagirniak
fuente
y si llamo a session.clear () esto le dice a accures nuevamente. ¿no? (todo lo demás genera el evento Session_End)
puerta trasera
Session.Clear solo eliminará elementos de la sesión. Nada mas. Puede llamarlo tantas veces como sea necesario.
Dmytrii Nagirniak
@AnthonyWJones, tienes razón, "destruir" es incorrecto decirlo. Mejor es ELIMINAR objetos de la sesión. Pero Session.Clear tampoco destruye objetos, los elimina de la sesión para que puedan ser recolectados como basura. Además, no se recomienda almacenar objetos COMPLEJOS, de lo contrario lo considero bien.
Dmytrii Nagirniak
@Dmitriy: ¿Por qué "no se recomienda almacenar objetos COMPLEJOS"?
Kamarey
5
@Ads Estoy de acuerdo, aunque lo ampliaría diciendo que Session.Clearse puede comparar a sacar todos los libros del estante inmediatamente , mientras que Session.Abandones más como decir "tira todo el estante y avísame cuando hayas terminado ".
WynandB
20

Cuando tenga Abandon()una sesión, usted (o más bien el usuario) obtendrá un nuevo SessionId (en la próxima solicitud). Cuando tiene Clear()una sesión, todos los valores almacenados se eliminan, pero el SessionId permanece intacto.

Hans Ke st ing
fuente
3
Gracias. pero de acuerdo con el libro de mattew macdonalds, puede usar la misma identificación de sesión. Quiero decir que si el atributo regenerateExpiredSessionId en la configuración / system.web / sessionState elemento en el archivo web.config es falso, ASP.Net usa la identificación de sesión anterior
puerta trasera
2
@Hans Kesting No obtendrá un nuevo ID de sesión cuando se llame a abandon. Tiene que establecer explícitamente la cookie ASPNET_SessionID en nula para obtener una nueva ID de sesión.
Zo tiene
9

Se trata de una especie de cubierta por las diferentes respuestas anteriores, pero la primera vez que leí este artículo se perdió un hecho importante, lo que condujo a un error menor en mi código ...

Session.Clear() BORRARÁ los valores de todas las claves pero NO provocará que se active el evento de fin de sesión.

Session.Abandon()NO borrará los valores de la solicitud actual. SI se solicita otra página, los valores desaparecerán para esa. Sin embargo, abandonar WILL lanzará el evento.

Entonces, en mi caso (¿y quizás en el tuyo?), Necesitaba que me Clear()siguieran Abandon().

NRC
fuente
1
¿Por qué necesitaría Session.Clear () seguido de Session.Abandon ()? ¿Está limpiando valores de una colección que está destruyendo? Esto es completamente redundante. Seguro que el objeto de la sesión no se destruye inmediatamente (eso ocurre al final de la solicitud actual), pero esa identificación de sesión ya no será atendida por ninguna solicitud posterior. Si el cliente hace una nueva solicitud, se le dará una nueva sesión. Llamar a Clear primero también causará problemas si desea acceder a las variables de sesión en el evento Session_End () de Global.Asax (no estarán allí porque las eliminó).
RepDbg
@RepDbg en realidad no estoy de acuerdo. Sesión.Abandono (). le da al cliente una nueva identificación de sesión. Session.clear borra toda la información en el servidor sobre la sesión para que ningún otro usuario pueda. Estoy de acuerdo con NRC
Micah Armantrout
@ Micah Armantrout No sigo tu lógica. ¿Por qué borrar una sesión con Session.Clear () y luego llamar a Session.Abandon () que no solo borra la sesión, sino que también la desasigna por completo? Además, Session.Abandon () no le da al cliente una nueva identificación de sesión. Una solicitud posterior será, pero no el cumplimiento de la solicitud que llamó a Session.Abandon ().
RepDbg
Si usa solo Session.Abandon, otra lógica restante en la canalización de ASP.NET aún puede acceder a los valores de sesión actuales.
Mark Sowul
6

este código funciona y no arroje ninguna excepción:

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

Esto se debe a que cuando se llama al método Abandon, el objeto Session actual se pone en cola para su eliminación, pero en realidad no se elimina hasta que se hayan procesado todos los comandos de la secuencia de comandos en la página actual. Esto significa que puede acceder a las variables almacenadas en el objeto Session en la misma página que la llamada al método Abandon pero no en ninguna página web posterior.

Por ejemplo, en el siguiente script, la tercera línea imprime el valor Mary. Esto se debe a que el objeto Session no se destruye hasta que el servidor haya terminado de procesar el script.

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

Si accede a la variable MyName en una página web posterior, está vacía. Esto se debe a que MyName se destruyó con el objeto Session anterior cuando la página que contenía el ejemplo anterior terminó de procesarse.

de la sesión de MSDN.

Siete
fuente
3

Al borrar una sesión, se eliminan los valores que se almacenaron allí, pero aún puede agregar nuevos allí. Después de destruir la sesión, no puede agregar nuevos valores allí.

RaYell
fuente
gracias, pero esto funciona: (inconsistente con su idea) Session.Abandon (); Sesión ["tempKey1"] = "tempValue1"; Response.Write (Sesión ["tempKey1"]. ToString ());
puerta trasera
Lo hace porque la sesión se destruirá después de actualizar la página. La identificación de la sesión se almacena (generalmente) en una cookie.
RaYell
No entiendo. Quiero decir, después de llamar a Session.Abandon () todavía puedo agregarle valores. (incluso si la página se publica y se vuelve a mostrar).
puerta trasera
1
Es posible que tenga su sesión configurada para autorregenerar la identificación después de que fue destruida. Entonces, cuando asigne un valor a la sesión destruida, se generará una nueva sesión automáticamente.
RaYell
1
sí, el uso de esta identificación de sesión se regenerará, pero mi pregunta es: ¿qué es diferente entre session.clear () y session.abandone ()? de esta manera cuando autoregenerate se establece en false estos tow no difieren en nada más que genere Sesion_End?
puerta trasera
3

clear-its elimina la clave o los valores de la colección de estado de sesión.

abandon-its eliminar o eliminar objetos de sesión de la sesión ..

maxy
fuente
1
Session.Abandon() 

destruirá / matará toda la sesión.

Session.Clear()

elimina / borra los datos de la sesión (es decir, las claves y valores de la sesión actual) pero la sesión estará activa.

Compare con el método Session.Abandon (), Session.Clear () no crea la nueva sesión, solo hace que todas las variables de la sesión sean NULL.

El ID de sesión seguirá siendo el mismo en ambos casos, siempre que el navegador no esté cerrado.

Session.RemoveAll()

Elimina todas las claves y valores de la colección de estado de sesión.

Session.Remove()

Elimina un elemento de la colección de estado de sesión.

Session.RemoveAt()

Elimina un elemento en un índice especificado de la colección de estado de sesión.

Session.TimeOut()

Esta propiedad especifica el período de tiempo de espera asignado al objeto Sesión para la aplicación. (el tiempo se especificará en minutos).

Si el usuario no actualiza o solicita una página dentro del período de tiempo de espera, la sesión finaliza.

Laxmi
fuente
0

Creo que sería útil usarlo en Session.Clear()lugar de usarlo Session.Abandon().

Porque los valores todavía existen en la sesión después de llamar más tarde, pero se eliminan después de llamar al primero.

Pra
fuente
0
this code works and dont throw any exception:

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

Una cosa a tener en cuenta aquí es que Session.Clear elimina elementos inmediatamente, pero Session.Abandon marca la sesión como abandonada al final de la solicitud actual. Eso simplemente significa que suponga que intentó acceder al valor en el código justo después de que se ejecutó el comando session.abandon, todavía estará allí. Así que no se confunda si su código simplemente no funciona incluso después de emitir el comando session.abandon e inmediatamente hacer algo de lógica con la sesión.

Biki
fuente