Яка різниця між Session.Abandon () та Session.Clear ()


109

Яка різниця між знищенням сеансу та видаленням його значень? Чи можете ви надати приклад, що це демонструє?

Я шукав це питання, але не розумію тотальної відповіді. Деякі відповіді:

  • Session.Abandon() знищує сеанс
  • Session.Clear() просто видаляє всі значення

Друг сказав мені це:

Очищення сеансу не призведе до скидання сеансу, він все ще існує з тим самим ідентифікатором для користувача, але зі значеннями, просто очищеними.

Відмова повністю знищить сеанс, це означає, що вам потрібно розпочати новий сеанс, перш ніж ви зможете зберегти більше значення в сеансі для цього користувача.

Наведений нижче код працює і не викидає жодних винятків.

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

Коли ви відмовитесь від (Session), ви (а точніше користувач) отримаєте новий SessionId

Коли я тестую сесію, вона не робить жодних змін, коли я припиняю сеанс.

Я просто знаходжу одну різницю: session.Abandon()піднімає Session_Endподію


5
Session.Clear видаліть елементи негайно, але Session.Abandon позначає сеанс відхиленням наприкінці поточного запиту.
RepDbg

Відповіді:


147

Очистити - Видаляє всі ключі та значення з колекції стану сеансу.

Відмова - видаляє всі об'єкти, що зберігаються на сесії. Якщо ви не зателефонували методом відмови явно, сервер видаляє ці об'єкти і знищує сеанс, коли час сеансу закінчується.
Він також викликає такі події, як Session_End .

Session.Clear можна порівняти з видаленням усіх книг з полиці , тоді як Session.Abandon - це більше, як викинути всю полицю .

Ти кажеш:

Коли я тестую сесію, вона не робить жодних змін, коли я припиняю сеанс.

Це правильно, коли ви робите це лише протягом одного запиту .
У наступному запиті сесія буде іншою. Але ідентифікатор сеансу можна повторно використовувати, щоб ідентичний номер залишився колишнім

Якщо ви будете використовувати Session.Clear, у вас буде однаковий сеанс у багатьох запитах.

Як правило, у більшості випадків потрібно використовувати Session.Clear.
Ви можете використовувати Session.Abandon, якщо ви впевнені, що користувач збирається покинути ваш сайт.

Тож повернемось до відмінностей:

  1. Відмова піднімає запит Session_End.
  2. Очищення видаляє предмети негайно, Відмовитися від цього немає.
  3. Abandon випускає об'єкт SessionState та його предмети, щоб він міг зібрати зібраний сміття для звільнення ресурсів. Clear зберігає SessionState та пов’язані з нею ресурси.

і якщо я зателефоную session.clear (), це ви скажете знову. ні? (все інше, що піднімає подію Session_End)
беквестор

Session.Clear видалятиме лише елементи з сесії. Більше нічого. Ви можете зателефонувати йому стільки разів, скільки потрібно.
Дмитрій Нагірняк

@AnthonyWJones, ви праві "знищити", неправильно сказати. Краще - ВИДАЛИТИ об’єкти з сеансу. Але Session.Clear також не знищує об'єкти, він видаляє thm з сеансу, щоб вони могли збирати сміття. Також не рекомендується зберігати КОМПЛЕКСні об'єкти, інакше я вважаю це чудово.
Дмитрій Нагірняк

@Dmitriy: Чому "зберігання об'єктів КОМПЛЕКСУ не рекомендується"?
Камарей

5
@ Я погоджуюсь, хоча я б продовжив це, сказавши, що Session.Clearце можна порівняти з видаленням усіх книг з полиці негайно , в той час Session.Abandonяк більше, як сказати "викинь всю полицю і дай мені знати, коли ти закінчиш ".
WynandB

20

Коли ви будете Abandon()сеансом, ви (а точніше користувач) отримаєте новий SessionId (на наступний запит). Коли ви займаєтеся Clear()сеансом, всі збережені значення видаляються, але SessionId залишається недоторканим.


3
Дякую. але, якщо ввійти до книги macdonalds mattew, вона може використовувати той самий ідентифікатор сеансу. Я означає, що якщо атрибут regenerateExpiredSessionId в конфігураційному / system.web / sessionState елементі у файлі web.config є помилковим, ASP.Net використовує старий ідентифікатор сесії
backdoor

2
@Hans Kesting Він не отримає новий ідентифікатор сесії, коли буде викликано відмову. Він повинен чітко встановити файл cookie ASPNET_SessionID на нуль, щоб отримати новий ідентифікатор сесії.
Zo має

9

Це свого роду охоплене різними відповідями вище, але вперше, коли я прочитав цю статтю, я пропустив важливий факт, що призвів до незначної помилки в моєму коді ...

Session.Clear() ОЧИКУЄ значення всіх клавіш, але НЕ буде спричиняти подія кінця сеансу.

Session.Abandon()НЕ очистить значення поточного запиту. Якщо буде запрошена інша сторінка, значення для цієї сторінки не буде. Однак відмовтеся, ЩО БУДЕ кинути подію.

Отже, у моєму випадку (а може, і у вашому?) Мені потрібно було Clear()слідувати Abandon().


1
Навіщо вам потрібен Session.Clear (), за яким слід Session.Abandon ()? Ви очищаєте значення колекції, яку ви знищуєте? Це абсолютно зайве. Переконайтеся, що об’єкт сеансу не буде негайно знищений (що відбувається в кінці поточного запиту), але цей ідентифікатор сеансу більше не подаватиметься жодним наступним запитом. Якщо клієнт зробить новий запит, йому буде наданий новий сеанс. Виклик спочатку Очистити також спричинить проблеми, якщо ви хочете отримати доступ до будь-яких змінних сеансу в події Session_End () Global.Asax (їх там не буде, оскільки ви їх очистили).
RepDbg

@RepDbg насправді я не згоден. Сесія.Назад (). дає клієнту новий ідентифікатор сесії. Session.clear очищає всю інформацію на сервері про сеанс, тому інші користувачі не можуть. Я згоден з NRC
Micah Armantrout

@ Micah Armantrout Я не дотримуюся вашої логіки. Чому очистити сеанс за допомогою Session.Clear (), а потім викликати Session.Abandon (), який не тільки очищає сеанс, але і повністю розмещає його? Також Session.Abandon () не дає клієнту нового ідентифікатора сеансу. Подальший запит буде, але не виконати запит, який викликав Session.Abandon ().
RepDbg

Якщо ви використовуєте тільки Session.Abandon, інша логіка в конвеєрі ASP.NET все ще може отримати доступ до поточних значень сеансу.
Марк Совул

6

цей код працює і не кидайте жодного винятку:

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

Це тому, що коли викликається метод Abandon, поточний об'єкт Session знаходиться в черзі для видалення, але насправді не видаляється, поки всі команди скриптів на поточній сторінці не будуть оброблені. Це означає, що ви можете отримати доступ до змінних, що зберігаються в об'єкті Session на тій самій сторінці, що і виклик методу Відмовитися, але не на будь-яких наступних веб-сторінках.

Наприклад, у наступному сценарії третій рядок друкує значення Mary. Це пояснюється тим, що об'єкт Session не знищується, поки сервер не закінчить обробку сценарію.

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

Якщо ви отримуєте доступ до змінної MyName на наступній веб-сторінці, вона порожня. Це пов’язано з тим, що MyName був знищений попереднім об’єктом сесії, коли сторінка, що містить попередній приклад, закінчила обробку.

від MSDN Session.Abandon


3

Очищення сеансу видаляє значення, які там зберігалися, але ви все одно можете додавати нові. Після знищення сеансу ви не можете додавати туди нових значень.


дякую, але це працює: (не відповідає вашій ідеї) Session.Abandon (); Сесія ["tempKey1"] = "tempValue1"; Response.Write (сесія ["tempKey1"]. ToString ());
заднім куточком

Це відбувається тому, що сеанс буде знищений після фактичного оновлення сторінки. Сесія ідентифікує її (як правило), зберігається у файлі cookie.
RaYell

я не розумію. я маю на увазі після того, як я зателефонував на Session.Abandon () все ще я можу додавати до нього значення. (навіть якщо сторінка розміщена назад і знову відображається).
заднім числом

1
Ви можете встановити сеанс автовирощення ідентифікатора після його знищення. Отже, коли ви присвоїте значення знищеному сеансу, новий сеанс буде генеруватися автоматично.
RaYell

1
так, використання цього ідентифікатора сесії відновиться, але моє питання: чим взагалі відрізняється між session.clear () та session.abandone (). таким чином, коли авторегенерація встановлена ​​на помилкові, ці буксир не відрізняються чим-небудь іншим, що піднімає Sesion_End?
задній кут

3

Очистити - видалити ключ або значення з колекції стану сеансу ..

відмовитися - видалити або видалити об’єкти сеансу з сеансу ..


1
Session.Abandon() 

знищить / вб'є весь сеанс.

Session.Clear()

видаляє / очищає дані сеансу (тобто ключі та значення з поточного сеансу), але сеанс буде активним.

Порівняйте з методом Session.Abandon (), Session.Clear () не створює новий сеанс, він просто робить усі змінні в сеансі NULL.

Ідентифікатор сесії залишатиметься однаковим в обох випадках, доки браузер не закриється.

Session.RemoveAll()

Він видаляє всі ключі та значення з колекції стану сеансу.

Session.Remove()

Він видаляє елемент із колекції сеансу стану.

Session.RemoveAt()

Він видаляє елемент у визначеному індексі з колекції стану сеансу.

Session.TimeOut()

Це властивість визначає період очікування, призначений об’єкту сесії для програми. (час буде вказано в хвилинах).

Якщо користувач не оновлює або не запитує сторінку протягом періоду очікування, сеанс закінчується.



0

Я думаю, що було б зручніше Session.Clear(), ніж використовувати Session.Abandon().

Оскільки значення все ще існують у сеансі після виклику пізніше, але вони видаляються після виклику першого.


0
this code works and dont throw any exception:

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

Тут слід зауважити, що Session.Clear видаляє елементи негайно, але Session.Abandon відзначає, що сеанс буде припинено наприкінці поточного запиту. Це просто означає, що припустимо, що ви намагалися отримати доступ до значення в коді відразу після виконання команди session.abandon, вона все ще буде. Тому не заплутайтеся, якщо ваш код просто не працює навіть після видачі команди session.abandon і негайно виконайте певну логіку з сеансом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.