Jaka jest różnica między Session.Abandon () a Session.Clear ()

109

Jaka jest różnica między zniszczeniem sesji a usunięciem jej wartości? Czy możesz podać przykład, który to potwierdza?

Szukałem tego pytania, ale nie rozumiem pełnej odpowiedzi. Oto niektóre odpowiedzi:

  • Session.Abandon() niszczy sesję
  • Session.Clear() po prostu usuwa wszystkie wartości

Znajomy powiedział mi to:

Wyczyszczenie sesji nie powoduje usunięcia sesji, nadal istnieje ona z tym samym identyfikatorem użytkownika, ale z wartościami po prostu wyczyszczonymi.

Porzucenie całkowicie zniszczy sesję, co oznacza, że ​​musisz rozpocząć nową sesję, zanim będziesz mógł przechowywać więcej wartości w sesji dla tego użytkownika.

Poniższy kod działa i nie zgłasza żadnych wyjątków.

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

Kiedy porzucisz () sesję, ty (a raczej użytkownik) otrzymasz nowy identyfikator sesji

Kiedy testuję sesję, nie wprowadza żadnych zmian, kiedy opuszczam sesję.

Widzę tylko jedną różnicę: session.Abandon()podnosi Session_Endwydarzenie

tylne drzwi
źródło
5
Session.Clear natychmiast usuwa elementy, ale Session.Abandon oznacza sesję do porzucenia na koniec bieżącego żądania.
RepDbg,

Odpowiedzi:

148

Wyczyść - usuwa wszystkie klucze i wartości z kolekcji stanu sesji.

Porzuć - usuwa wszystkie obiekty przechowywane w sesji. Jeśli nie wywołasz metody Abandon jawnie, serwer usunie te obiekty i zniszczy sesję po przekroczeniu limitu czasu sesji.
Podnosi również zdarzenia, takie jak Session_End .

Session.Clear można porównać do usunięcia wszystkich książek z półki , podczas gdy Session.Abandon bardziej przypomina wyrzucenie całej półki .

Mówisz:

Kiedy testuję sesję, nie wprowadza żadnych zmian, kiedy opuszczam sesję.

Jest to poprawne, jeśli robisz to tylko w ramach jednego żądania .
Na następne żądanie sesja będzie inna. Ale identyfikator sesji można ponownie wykorzystać, aby pozostał taki sam.

Jeśli będziesz używać Session.Clear, będziesz mieć tę samą sesję w wielu żądaniach.

Ogólnie rzecz biorąc, w większości przypadków musisz użyć Session.Clear.
Możesz użyć Session.Abandon, jeśli masz pewność, że użytkownik opuści Twoją witrynę.

Wróćmy więc do różnic:

  1. Abandon wywołuje żądanie Session_End.
  2. Clear natychmiast usuwa przedmioty, Abandon nie.
  3. Abandon zwalnia obiekt SessionState i jego elementy, aby można było zebrać elementy bezużyteczne w celu zwolnienia zasobów. Clear zachowuje stan SessionState i powiązane z nim zasoby.
Dmytrii Nagirniak
źródło
a jeśli zadzwonię do session.clear (), to znowu powiesz accures. nie? (wszystko inne podnosi zdarzenie Session_End)
backdoor
Session.Clear usunie tylko elementy z sesji. Nic więcej. Możesz dzwonić tyle razy, ile potrzeba.
Dmytrii Nagirniak
@AnthonyWJones, masz rację, powiedzenie „zniszcz” jest niepoprawne. Lepsze jest USUWANIE obiektów z sesji. Ale Session.Clear również nie niszczy obiektów, usuwa je z sesji, aby można je było zbierać jako śmieci. Również przechowywanie obiektów COMPLEX nie jest zalecane, w przeciwnym razie uważam to za w porządku.
Dmytrii Nagirniak
@Dmitriy: Dlaczego „przechowywanie obiektów COMPLEX nie jest zalecane”?
Kamarey
5
@Ads Zgadzam się, chociaż chciałbym przedłużyć go mówiąc, że Session.Clearmożna porównać do usuwania wszystkich książek z półki natychmiast , natomiast Session.Abandonjest bardziej jak powiedzenie „wyrzucić całą półkę i daj mi znać, kiedy skończysz ”.
WynandB
20

Kiedy jesteś Abandon()sesją, ty (a raczej użytkownik) otrzymasz nowy identyfikator sesji (przy następnym żądaniu). Gdy jesteś Clear()sesją, wszystkie zapisane wartości są usuwane, ale SessionId pozostaje nienaruszone.

Hans Ke ing
źródło
3
dzięki. ale zgodnie z książką Mattew Macdonalds może używać tego samego identyfikatora sesji. Oznacza to, że jeśli atrybut regenerateExpiredSessionId w elemencie configuration / system.web / sessionState w pliku web.config jest fałszywy, ASP.Net używa starego identyfikatora sesji
backdoor
2
@Hans Kesting Nie otrzyma nowego identyfikatora sesji, gdy zostanie wywołane porzucenie. Musi jawnie ustawić plik cookie ASPNET_SessionID na wartość null, aby uzyskać nowy identyfikator sesji.
Zo ma
9

Jest to w pewnym sensie omówione w różnych odpowiedziach powyżej, ale gdy po raz pierwszy przeczytałem ten artykuł, przegapiłem ważny fakt, który doprowadził do drobnego błędu w moim kodzie ...

Session.Clear() CZYŚCI wartości wszystkich kluczy, ale NIE spowoduje wywołania zdarzenia zakończenia sesji.

Session.Abandon()NIE wyczyści wartości w bieżącym żądaniu. JEŻELI zażądana zostanie kolejna strona, wartości dla tej strony zostaną utracone. Jednak porzucić BĘDZIE rzucić wydarzenie.

Tak więc w moim przypadku (a może w twoim?) Musiałem Clear()śledzić Abandon().

NRC
źródło
1
Dlaczego potrzebujesz Session.Clear (), a po nim Session.Abandon ()? Czy usuwasz wartości kolekcji, którą niszczysz? To jest całkowicie zbędne. Na pewno obiekt sesji nie zostanie natychmiast zniszczony (dzieje się to pod koniec bieżącego żądania), ale ten identyfikator sesji nie będzie już obsługiwany przez żadne kolejne żądanie. Jeśli klient złoży nowe żądanie, zostanie mu przydzielona nowa sesja. Wywołanie Clear jako pierwsze spowoduje również problemy, jeśli chcesz uzyskać dostęp do jakichkolwiek zmiennych sesji w zdarzeniu Session_End () obiektu Global.Asax (nie będzie ich tam, ponieważ je wyczyściłeś).
RepDbg
@RepDbg właściwie się nie zgadzam. Session.Abandon (). daje klientowi nowy identyfikator sesji. Session.clear usuwa z serwera wszystkie informacje o sesji, aby nikt inny nie mógł tego zrobić. Zgadzam się z NRC
Micah Armantrout
@ Micah Armantrout Nie podążam za twoją logiką. Po co czyścić sesję za pomocą Session.Clear (), a następnie wywoływać Session.Abandon (), który nie tylko czyści sesję, ale także całkowicie ją zwalnia? Również Session.Abandon () nie podaje klientowi nowego identyfikatora sesji. Kolejne żądanie będzie, ale nie spełniło żądania, które wywołało Session.Abandon ().
RepDbg
Jeśli używasz tylko Session.Abandon, inna pozostała logika w potoku ASP.NET nadal może uzyskiwać dostęp do bieżących wartości sesji.
Mark Sowul,
6

ten kod działa i nie zgłaszaj żadnych wyjątków:

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

Dzieje się tak, ponieważ wywołanie metody Abandon powoduje, że bieżący obiekt Session jest umieszczany w kolejce do usunięcia, ale w rzeczywistości nie jest usuwany, dopóki nie zostaną przetworzone wszystkie polecenia skryptu na bieżącej stronie. Oznacza to, że można uzyskać dostęp do zmiennych przechowywanych w obiekcie Session na tej samej stronie, co wywołanie metody Abandon, ale nie na kolejnych stronach sieci Web.

Na przykład w poniższym skrypcie trzecia linia wypisuje wartość Mary. Dzieje się tak, ponieważ obiekt Session nie jest niszczony, dopóki serwer nie zakończy przetwarzania skryptu.

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

Jeśli uzyskasz dostęp do zmiennej MyName na kolejnej stronie sieci Web, jest ona pusta. Dzieje się tak, ponieważ MyName zostało zniszczone przez poprzedni obiekt Session, gdy strona zawierająca poprzedni przykład zakończyła przetwarzanie.

z MSDN Session.Abandon

Siedem
źródło
3

Wyczyszczenie sesji usuwa wartości, które były tam przechowywane, ale nadal możesz tam dodawać nowe. Po zniszczeniu sesji nie możesz dodać tam nowych wartości.

RaYell
źródło
dzięki, ale to działa: (niezgodne z Twoim pomysłem) Session.Abandon (); Sesja ["tempKey1"] = "tempValue1"; Response.Write (Session ["tempKey1"]. ToString ());
backdoor
Dzieje się tak, ponieważ sesja zostanie zniszczona po faktycznym odświeżeniu strony. Identyfikator sesji to (zwykle) przechowywane w pliku cookie.
RaYell
Nie rozumiem. mam na myśli, że po wywołaniu Session.Abandon () nadal mogę dodać do niego wartości. (nawet jeśli strona jest publikowana i ponownie renderuje się).
backdoor
1
Możesz ustawić sesję na automatyczną regenerację identyfikatora po jej zniszczeniu. Więc kiedy przypiszesz wartość do zniszczonej sesji, nowa sesja zostanie wygenerowana automatycznie.
RaYell
1
tak, użycie tego identyfikatora sesji zostanie zregenerowane, ale moje pytanie brzmi: czym w ogóle różni się session.clear () i session.abandone (). w ten sposób, gdy autoregenerate jest ustawione na false, te holowanie nie różni się niczym innym, co powoduje Sesion_End?
backdoor
3

wyczyść klucz lub wartości z kolekcji stanu sesji.

porzucić - usunąć lub usunąć obiekty sesji z sesji.

maxy
źródło
1
Session.Abandon() 

zniszczy / zabije całą sesję.

Session.Clear()

usuwa / czyści dane sesji (tj. klucze i wartości z bieżącej sesji), ale sesja będzie żyła.

W porównaniu z metodą Session.Abandon (), Session.Clear () nie tworzy nowej sesji, po prostu zmienia wszystkie zmienne w sesji na NULL.

Identyfikator sesji pozostanie taki sam w obu przypadkach, o ile przeglądarka nie zostanie zamknięta.

Session.RemoveAll()

Usuwa wszystkie klucze i wartości z kolekcji stanu sesji.

Session.Remove()

Usuwa element z kolekcji stanu sesji.

Session.RemoveAt()

Usuwa element o określonym indeksie z kolekcji stanu sesji.

Session.TimeOut()

Ta właściwość określa limit czasu przypisany do obiektu Session dla aplikacji. (czas zostanie określony w minutach).

Jeśli użytkownik nie odświeży ani nie zażąda strony w określonym czasie, sesja kończy się.

Laxmi
źródło
0

Myślę, że przydałoby się Session.Clear()raczej używać niż używać Session.Abandon().

Ponieważ wartości nadal istnieją w sesji po późniejszym wywołaniu, ale są usuwane po wywołaniu pierwszego.

Pra
źródło
0
this code works and dont throw any exception:

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

Należy tu zauważyć, że Session.Clear usuwa elementy natychmiast, ale Session.Abandon oznacza sesję do porzucenia na koniec bieżącego żądania. Oznacza to po prostu, że przypuśćmy, że próbowałeś uzyskać dostęp do wartości w kodzie tuż po wykonaniu polecenia session.abandon, nadal będzie tam. Więc nie daj się zmylić, jeśli twój kod po prostu nie działa nawet po wydaniu polecenia session.abandon i natychmiastowym wykonaniu logiki z sesją.

Biki
źródło