Quelle est la différence entre Session.Abandon () et Session.Clear ()

109

Quelle est la différence entre détruire une session et supprimer ses valeurs? Pouvez-vous donner un exemple pour illustrer cela?

J'ai cherché cette question, mais je ne saisis pas la réponse totale. Certaines réponses sont:

  • Session.Abandon() détruit la session
  • Session.Clear() supprime simplement toutes les valeurs

Un ami m'a dit ceci:

La suppression de la session n'annulera pas la session, elle existe toujours avec le même ID pour l'utilisateur mais avec les valeurs simplement effacées.

L'abandon détruira complètement la session, ce qui signifie que vous devez commencer une nouvelle session avant de pouvoir stocker d'autres valeurs dans la session pour cet utilisateur.

Le code ci-dessous fonctionne et ne lève aucune exception.

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

Lorsque vous abandonnez () une session, vous (ou plutôt l'utilisateur) obtiendrez un nouveau SessionId

Lorsque je teste la session, cela n'apporte aucun changement lorsque j'abandonne la session.

Je trouve juste une différence: session.Abandon()soulève l' Session_Endévénement

porte de derrière
la source
5
Session.Clear supprime les éléments immédiatement mais Session.Abandon marque la session à abandonner à la fin de la demande en cours.
RepDbg

Réponses:

148

Clear - Supprime toutes les clés et valeurs de la collection d'état de session.

Abandon - supprime tous les objets stockés dans une session. Si vous n'appelez pas explicitement la méthode Abandon, le serveur supprime ces objets et détruit la session lorsque la session expire.
Il déclenche également des événements tels que Session_End .

Session.Clear peut être comparé à la suppression de tous les livres de l'étagère , tandis que Session.Abandon revient plus à jeter l'étagère entière .

Vous dites:

Lorsque je teste la session, cela n'apporte aucun changement lorsque j'abandonne la session.

Ceci est correct tant que vous le faites dans une seule demande .
A la prochaine demande, la session sera différente. Mais l' ID de session peut être réutilisé afin que l'ID reste le même.

Si vous utilisez Session.Clear, vous aurez la même session dans de nombreuses requêtes.

Généralement, dans la plupart des cas, vous devez utiliser Session.Clear.
Vous pouvez utiliser Session.Abandon si vous êtes sûr que l'utilisateur va quitter votre site.

Revenons donc aux différences:

  1. Abandon déclenche la requête Session_End.
  2. Clear supprime les éléments immédiatement, Abandon ne le fait pas.
  3. Abandon libère l'objet SessionState et ses éléments afin qu'il puisse être récupéré pour libérer les ressources. Clear conserve SessionState et les ressources qui lui sont associées.
Dmytrii Nagirniak
la source
et si j'appelle session.clear (), cela vous dit à nouveau les accures. ne pas? (tout le reste soulevant l'événement Session_End)
porte dérobée
Session.Clear supprimera uniquement les éléments de la session. Rien de plus. Vous pouvez l'appeler autant de fois que nécessaire.
Dmytrii Nagirniak
@AnthonyWJones, vous avez raison "détruire" est incorrect à dire. Mieux vaut SUPPRIMER les objets de la session. Mais Session.Clear ne détruit pas non plus les objets, il supprime thm de la session afin qu'ils puissent être récupérés. De plus, il n'est pas recommandé de stocker des objets COMPLEX, sinon je le considère bien.
Dmytrii Nagirniak
@Dmitriy: Pourquoi "stocker des objets COMPLEX n'est pas recommandé"?
Kamarey
5
@Ads Je suis d'accord, même si je le prolongerais en disant que cela Session.Clearpeut être comparé au retrait immédiat de tous les livres de l'étagère , alors que cela Session.Abandonrevient plutôt à dire "jetez toute l'étagère et faites-moi savoir quand vous avez terminé ".
WynandB
20

Lorsque vous effectuez Abandon()une session, vous (ou plutôt l'utilisateur) obtiendrez un nouveau SessionId (à la prochaine requête). Lorsque vous effectuez Clear()une session, toutes les valeurs stockées sont supprimées, mais l'identifiant de session reste intact.

Hans Ke st ing
la source
3
Merci. mais selon le livre mattew macdonalds, il peut utiliser le même identifiant de session. i signifie que si l'attribut regenerateExpiredSessionId de l'élément configuration / system.web / sessionState dans le fichier web.config est faux, ASP.Net utilise l'ancien identifiant de session
porte dérobée
2
@Hans Kesting Il n'obtiendra pas de nouvel identifiant de session lorsque l'abandon sera appelé. Il doit définir explicitement le cookie ASPNET_SessionID sur null afin d'obtenir un nouvel ID de session.
Zo a
9

C'est en quelque sorte couvert par les différentes réponses ci-dessus, mais la première fois que j'ai lu cet article, j'ai manqué un fait important, qui a conduit à un bug mineur dans mon code ...

Session.Clear() effacera les valeurs de toutes les clés mais ne provoquera PAS le déclenchement de l'événement de fin de session.

Session.Abandon()n'effacera PAS les valeurs de la demande en cours. SI une autre page est demandée, les valeurs seront perdues pour celle-là. Cependant, l'abandon lancera l'événement.

Donc, dans mon cas (et peut-être dans le vôtre?), Il me fallait Clear()suivi par Abandon().

CNRC
la source
1
Pourquoi auriez-vous besoin de Session.Clear () suivi de Session.Abandon ()? Vous effacez les valeurs d'une collection que vous êtes en train de détruire? C'est complètement redondant. Bien sûr, l'objet de session n'est pas immédiatement détruit (cela se produit à la fin de la demande en cours), mais cet identifiant de session ne sera plus servi par aucune demande ultérieure. Si le client fait une nouvelle demande, une nouvelle session lui sera donnée. Appeler Clear en premier posera également des problèmes si vous vouliez accéder à des variables de session dans l'événement Session_End () de Global.Asax (elles ne seront pas là car vous les avez effacées).
RepDbg
@RepDbg en fait, je ne suis pas d'accord. Session.Abandon (). donne au client un nouvel identifiant de session. Session.clear efface toutes les informations sur la session sur le serveur afin qu'aucun autre utilisateur ne puisse le faire.Je suis d'accord avec NRC
Micah Armantrout
@ Micah Armantrout Je ne suis pas votre logique. Pourquoi effacer une session avec Session.Clear (), puis appeler Session.Abandon () qui non seulement efface la session, mais la désalloue également complètement? Session.Abandon () ne donne pas non plus au client un nouvel identifiant de session. Une demande ultérieure sera, mais pas l'accomplissement de la demande qui a appelé Session.Abandon ().
RepDbg
Si vous utilisez uniquement Session.Abandon, toute autre logique restante dans le pipeline ASP.NET peut toujours accéder aux valeurs de session actuelles.
Mark Sowul
6

ce code fonctionne et ne lance aucune exception:

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

C'est parce que lorsque la méthode Abandon est appelée, l'objet Session en cours est mis en file d'attente pour suppression mais n'est pas réellement supprimé tant que toutes les commandes de script de la page actuelle n'ont pas été traitées. Cela signifie que vous pouvez accéder aux variables stockées dans l'objet Session sur la même page que l'appel à la méthode Abandon mais pas dans les pages Web suivantes.

Par exemple, dans le script suivant, la troisième ligne imprime la valeur Mary. Cela est dû au fait que l'objet Session n'est pas détruit tant que le serveur n'a pas terminé le traitement du script.

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

Si vous accédez à la variable MyName sur une page Web suivante, elle est vide. Cela est dû au fait que MyName a été détruit avec l'objet Session précédent lorsque la page contenant l'exemple précédent a terminé le traitement.

depuis MSDN Session.Abandon

Sept
la source
3

La suppression d'une session supprime les valeurs qui y étaient stockées, mais vous pouvez toujours en ajouter de nouvelles. Après avoir détruit la session, vous ne pouvez pas y ajouter de nouvelles valeurs.

RaYell
la source
merci mais cela fonctionne: (incompatible avec votre idée) Session.Abandon (); Session ["tempKey1"] = "tempValue1"; Response.Write (Session ["tempKey1"]. ToString ());
porte dérobée le
C'est le cas parce que la session sera détruite après l'actualisation de votre page. Identifiant de session il (généralement) stocké dans un cookie.
RaYell
Je ne comprends pas. Je veux dire, après avoir appelé Session.Abandon (), je peux toujours y ajouter des valeurs. (même si la page est postée encore et encore rend).
porte dérobée le
1
Vous pouvez avoir défini votre session sur la régénération automatique de l'identifiant après sa destruction. Ainsi, lorsque vous attribuez une valeur à la session détruite, une nouvelle session sera générée automatiquement.
RaYell
1
oui, l'utilisation de cet identifiant de session régénérera mais ma question est: qu'est-ce qui est différent entre session.clear () et session.abandone () du tout. de cette manière, lorsque la régénération automatique est définie sur false, ces câbles ne diffèrent en rien d'autre en soulevant Sesion_End?
porte dérobée le
3

clear-its remove key ou values ​​from session state collection ..

abandon-son supprimer ou supprimer des objets de session de la session.

maxy
la source
1
Session.Abandon() 

détruira / tuera toute la session.

Session.Clear()

supprime / efface les données de session (c'est-à-dire les clés et les valeurs de la session en cours) mais la session sera active.

Comparé à la méthode Session.Abandon (), Session.Clear () ne crée pas la nouvelle session, il rend simplement toutes les variables de la session NULL.

L'ID de session restera le même dans les deux cas, tant que le navigateur n'est pas fermé.

Session.RemoveAll()

Il supprime toutes les clés et valeurs de la collection d'état de session.

Session.Remove()

Il supprime un élément de la collection d'état de session.

Session.RemoveAt()

Il supprime un élément à un index spécifié de la collection d'état de session.

Session.TimeOut()

Cette propriété spécifie le délai d'expiration attribué à l'objet Session pour l'application. (l'heure sera spécifiée en minutes).

Si l'utilisateur n'actualise pas ou ne demande pas de page dans le délai d'expiration, la session se termine.

Laxmi
la source
0

Je pense qu'il serait pratique d'utiliser Session.Clear()plutôt que d'utiliserSession.Abandon() .

Parce que les valeurs existent toujours en session après un appel ultérieur, mais sont supprimées après avoir appelé la première.

Pra
la source
0
this code works and dont throw any exception:

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

Une chose à noter ici que Session.Clear supprime les éléments immédiatement mais Session.Abandon marque la session à abandonner à la fin de la requête en cours. Cela signifie simplement que supposons que vous ayez essayé d'accéder à la valeur dans le code juste après l'exécution de la commande session.abandon, elle sera toujours là. Donc, ne soyez pas confus si votre code ne fonctionne tout simplement pas même après avoir émis la commande session.abandon et avoir immédiatement fait une logique avec la session.

Biki
la source