2009-09-24 13 views
93

¿Cuál es la diferencia entre destruir una sesión y eliminar sus valores? ¿Puedes dar un ejemplo demostrando esto?¿Cuál es la diferencia entre Session.Abandon() y Session.Clear()

He buscado esta pregunta, pero no entiendo la respuesta total. Algunas respuestas son:

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

un amigo me dijo esto:

Borrado de la sesión no se desarmará la sesión, todavía existe con el mismo ID para el usuario pero con los valores simplemente borrados.

Abandonar destruirá la sesión por completo, lo que significa que usted necesita para comenzar una nueva sesión antes de que pueda tienda de cualquier valor más en la sesión para ese usuario.

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

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

Cuando se abandona() de una sesión, usted (o más bien la usuario) recibirá una nueva SessionId

Cuando la prueba de sesiones, no se hace ningún cambio cuando Abandono la sesión.

acabo de encontrar una diferencia: session.Abandon() plantea Session_End caso

+3

Sesión.Borre los elementos inmediatamente, pero Session.Abandon marca la sesión que se abandonará al final de la solicitud actual. – RepDbg

Respuesta

127

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

Abandon - elimina todos los objetos almacenados en una sesión. Si no llama explícitamente al método Abandon, el servidor elimina estos objetos y destruye la sesión cuando la sesión expira.
También plantea eventos como Session_End.

Session.clear se puede comparar con la eliminación de todos los libros de la estantería, mientras Session.Abandon es más como tirar toda la plataforma.

Usted dice:

Cuando la prueba de sesiones, no hace ningún cambio cuando abandonan la sesión.

Esto es correcto mientras lo está haciendo dentro de una solicitud solamente.
En la próxima solicitud, la sesión será diferente. Pero el session ID can be reused para que la identificación permanezca igual.

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

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

Así que de vuelta a las diferencias:

  1. Abandonar plantea petición Session_End.
  2. Borrar elimina elementos de forma inmediata, Abandon no lo hace.
  3. Abandon libera el objeto SessionState y sus elementos para que pueda eliminar la basura recolectada para liberar los recursos. Clear mantiene SessionState y los recursos asociados con él.
+0

y si llamo session.clear() esto le dice a accures nuevamente. ¿no? (todo lo demás provoca el evento Session_End) – backdoor

+0

Session.Clear ** solo ** eliminará elementos de la sesión. Nada mas. Puede llamarlo tantas veces como sea necesario. –

+0

Añadido meatphora-comparisson. –

3

Borrado de una sesión elimina los valores que estaban almacenados allí, pero todavía se pueden añadir otras nuevas allí. Después de destruir la sesión, no puede agregar nuevos valores allí.

+0

gracias pero esto funciona: (inconsistente con su idea) Session.Abandon(); Session ["tempKey1"] = "tempValue1"; Response.Write (Session ["tempKey1"]. ToString()); – backdoor

+0

Lo hace porque la sesión se destruirá después de actualizar la página en realidad. ID de sesión (normalmente) almacenado en una cookie. – RaYell

+0

no entiendo. quiero decir después de que llamo Session.Abandon() todavía puedo agregarle valores. (incluso si la página se publica nuevamente y vuelve a mostrarse). – backdoor

17

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

+2

gracias. pero accroding a mattew macdonalds book puede usar la misma identificación de sesión. i significa que si el atributo regenerateExpiredSessionId en el elemento configuration/system.web/sessionState en el archivo web.config es falso ASP.Net usa el ID de sesión anterior – backdoor

+0

@Hans Kesting No recibirá un nuevo Id. de sesión cuando se invoca abandono. Tiene que establecer explícitamente la cookie ASPNET_SessionID en nulo para obtener una nueva ID de sesión. –

+0

respuesta perfecta que estaba buscando –

3

clara su clave o quitar valores de la colección de estado de sesión ..

abandonar su remove-objetos de sesión o borrados de la sesión ..

7

Ésta es tipo de cubierta por las diferentes respuestas anteriores, pero la primera vez que leí este artículo me perdí un hecho importante, lo que condujo a un error menor en mi código ...

Session.Clear() despejará los valores de todas las teclas pero NO provocarán que el evento final de sesión se dispare.

Session.Abandon() NO borrará los valores en la solicitud actual. Si se solicita otra página, los valores habrán desaparecido para esa. Sin embargo, abandonará lanzará el evento.

Entonces, en mi caso (¿y quizás en el tuyo?), Necesitaba Clear() seguido de Abandon().

+1

¿Por qué necesitaría Session.Clear() seguido de Session.Abandon()? ¿Está borrando los 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 la sesión ya no será servida por ninguna solicitud posterior. Si el cliente hace una nueva solicitud, se les dará una nueva sesión. Llamar primero a Clear Clear también causará problemas si desea acceder a cualquier variable de sesión en el evento Session_End() del Global.Asax (no estarán allí porque usted las autorizó). – RepDbg

+0

@RepDbg en realidad no estoy de acuerdo. Session.Abandon(). le da al cliente una nueva identificación de sesión. Session.clear borra toda la información del servidor sobre la sesión para que ningún otro usuario pueda. Estoy de acuerdo con NRC –

+0

@ Micah Armantrout. No estoy siguiendo tu lógica. ¿Por qué borrar una sesión con Session.Clear(), luego llamar a Session.Abandon() que no solo borra la sesión, sino que también la desasigna completamente? También Session.Abandon() no le da al cliente una nueva identificación de sesión. Una solicitud posterior lo hará, pero no el cumplimiento de la solicitud que llamó Session.Abandon(). – RepDbg

0

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

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

3

este código funciona y No lanzar ninguna excepción:

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

Es porque cuando el método Abandon se llama, el objeto de sesión actual se pone en cola para su eliminación, pero no se elimina realmente hasta que todo el comandos de script en la página actual han sido procesados. Esto significa que puede acceder a las variables almacenadas en el objeto Session en la misma página que la llamada al método Abandonar, pero no a las páginas web subsiguientes.

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 ha 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 contiene el ejemplo anterior finalizó el procesamiento.

de MSDN Session.Abandon

0
Session.Abandon() 

va a destruir/matar a 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án vivos.

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

La ID de sesión se mantendrá igual en ambos casos, siempre que el navegador no esté cerrado.

Session.RemoveAll() 

Elimina todas las claves y valores de la colección del estado de la 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 tiempo de espera asignado al objeto de sesión para la aplicación. (el tiempo se especificará en minutos).

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

0
this code works and dont throw any exception: 

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

Hay que destacar aquí que Session.clear eliminar elementos de inmediato, pero Session.Abandon marca la sesión que ser abandonado al final de la solicitud actual. Eso simplemente significa que supongamos que intentó acceder al valor en el código justo después de que se ejecutó el comando session.abandon, aún 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 haciendo algo de lógica con la sesión.

Cuestiones relacionadas