В чем разница между Session.Abandon () и Session.Clear ()

110

В чем разница между уничтожением сеанса и удалением его значений? Не могли бы вы привести пример, демонстрирующий это?

Я искал этот вопрос, но не понял полного ответа. Вот некоторые ответы:

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

Друг сказал мне это:

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

Отказ полностью уничтожит сеанс, а это означает, что вам нужно начать новый сеанс, прежде чем вы сможете сохранить какие-либо другие значения в сеансе для этого пользователя.

Приведенный ниже код работает и не вызывает никаких исключений.

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

Когда вы Abandon () a Session, вы (или, скорее, пользователь) получите новый SessionId

Когда я тестирую сеанс, он не вносит никаких изменений, когда я прекращаю сеанс.

Я просто нахожу одно отличие: session.Abandon()вызывает Session_Endсобытие

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

Ответы:

149

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

Abandon - удаляет все объекты, хранящиеся в сеансе. Если вы не вызываете метод Abandon явно, сервер удаляет эти объекты и уничтожает сеанс по истечении времени ожидания сеанса.
Он также вызывает такие события, как Session_End .

Session.Clear можно сравнить с удалением всех книг с полки , в то время как Session.Abandon больше похож на выброс всей полки .

Ты говоришь:

Когда я тестирую сеанс, он не вносит никаких изменений, когда я прекращаю сеанс.

Это правильно, если вы делаете это только в рамках одного запроса .
При следующем запросе сеанс будет другим. Но идентификатор сеанса можно использовать повторно, так что идентификатор останется прежним.

Если вы будете использовать Session.Clear, у вас будет один и тот же сеанс во многих запросах.

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

Итак, вернемся к различиям:

  1. Abandon вызывает запрос Session_End.
  2. Clear удаляет предметы сразу, Abandon - нет.
  3. Abandon освобождает объект SessionState и его элементы, чтобы он мог собрать мусор для освобождения ресурсов. Clear сохраняет состояние SessionState и связанные с ним ресурсы.
Дмитрий Нагирняк
источник
и если я вызываю session.clear (), вы снова говорите об ошибке. не? (все остальное вызывает событие Session_End)
бэкдор
Session.Clear удалит только элементы из сеанса. Ничего более. Вы можете звонить сколько угодно раз.
Дмитрий Нагирняк
@AnthonyWJones, вы правы, "уничтожить" неверно. Лучше УДАЛИТЬ объекты из сеанса. Но Session.Clear также не уничтожает объекты, он удаляет их из сеанса, чтобы их можно было собрать сборщиком мусора. Также не рекомендуется хранить СЛОЖНЫЕ объекты, иначе я считаю это нормальным.
Дмитрий Нагирняк
@Dmitriy: Почему "хранить СЛОЖНЫЕ объекты не рекомендуется"?
Камарей,
5
@Ads Я согласен, хотя я бы расширил его, сказав, что Session.Clearэто можно сравнить с немедленным удалением всех книг с полки , в то время как Session.Abandonэто больше похоже на высказывание «выбросьте всю полку и дайте мне знать, когда закончите ».
WynandB
20

Когда вы Abandon()используете Session, вы (или, скорее, пользователь) получите новый SessionId (при следующем запросе). Когда вы находитесь Clear()в сеансе, все сохраненные значения удаляются, но SessionId остается неизменным.

Ханс Кеинг
источник
3
Спасибо. но, согласно книге Мэттью Макдональдса, он может использовать тот же идентификатор сеанса. i означает, что если атрибут регенерацииExpiredSessionId в элементе configuration / system.web / sessionState в файле web.config является ложным, ASP.Net использует старый идентификатор сеанса
бэкдор
2
@Hans Kesting Он не получит новый идентификатор сеанса при вызове отказа. Он должен явно установить для cookie ASPNET_SessionID значение null, чтобы получить новый идентификатор сеанса.
Zo Has
9

Это своего родом из охватываются различными реакциями выше, но первый раз , когда я прочитал эту статью , я пропустил один важный факт, что привело к незначительной ошибке в моем коде ...

Session.Clear() ОЧИСТИТ значения всех ключей, но НЕ приведет к срабатыванию события завершения сеанса.

Session.Abandon()НЕ очистит значения в текущем запросе. ЕСЛИ запрашивается другая страница, значения для этой страницы пропадают. Однако отказаться БУДЕТ отбрасывать событие.

Итак, в моем случае (и, возможно, в вашем?) Мне нужно было Clear()следовать Abandon().

NRC
источник
1
Зачем вам нужен Session.Clear (), а затем Session.Abandon ()? Вы очищаете ценности коллекции, которую разрушаете? Это полностью избыточно. Конечно, объект сеанса не уничтожается немедленно (это происходит в конце текущего запроса), но этот идентификатор сеанса больше не будет обслуживаться любым последующим запросом. Если клиент сделает новый запрос, ему будет предоставлен новый сеанс. Вызов Clear первым также вызовет проблемы, если вы хотите получить доступ к любым переменным сеанса в событии Session_End () Global.Asax (их там не будет, потому что вы их очистили).
RepDbg 09
@RepDbg на самом деле я не согласен. Сессия.Абандон (). дает клиенту новый идентификатор сеанса. Session.clear очищает всю информацию о сеансе на сервере, поэтому другие пользователи не могут. Я согласен с NRC
Мика Армантроут
@ Мика Армантроут Я не следую твоей логике. Зачем очищать сеанс с помощью Session.Clear (), а затем вызывать Session.Abandon (), который не только очищает сеанс, но и полностью освобождает его? Также Session.Abandon () не дает клиенту новый идентификатор сеанса. Последующий запрос будет, но не выполнение запроса, который вызвал Session.Abandon ().
RepDbg
Если вы используете только Session.Abandon, другая оставшаяся логика в конвейере ASP.NET все еще может получить доступ к текущим значениям сеанса.
Марк Совул
6

этот код работает и не вызывает никаких исключений:

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

Это связано с тем, что при вызове метода Abandon текущий объект сеанса ставится в очередь на удаление, но фактически не удаляется, пока все команды сценария на текущей странице не будут обработаны. Это означает, что вы можете получить доступ к переменным, хранящимся в объекте Session на той же странице, что и вызов метода Abandon, но не на любых последующих веб-страницах.

Например, в следующем сценарии в третьей строке печатается значение Мэри. Это связано с тем, что объект Session не уничтожается, пока сервер не завершит обработку сценария.

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

Если вы обращаетесь к переменной MyName на следующей веб-странице, она пуста. Это связано с тем, что MyName было уничтожено с помощью предыдущего объекта Session, когда страница, содержащая предыдущий пример, завершила обработку.

из MSDN Session.Abandon

Семь
источник
3

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

RaYell
источник
спасибо, но это работает: (несовместимо с вашей идеей) Session.Abandon (); Сессия ["tempKey1"] = "tempValue1"; Response.Write (Сессия ["tempKey1"]. ToString ());
backdoor
Это происходит потому, что сеанс будет уничтожен после того, как вы действительно обновите свою страницу. Идентификатор сеанса (обычно) хранится в файле cookie.
RaYell
я не понимаю. Я имею в виду, что после вызова Session.Abandon () я все еще могу добавлять к нему значения. (даже если страница отправляется обратно и снова отображается).
бэкдор
1
Вы можете настроить сеанс на автоматическое восстановление идентификатора после его уничтожения. Поэтому, когда вы присваиваете значение уничтоженному сеансу, новый сеанс будет создан автоматически.
RaYell
1
да, использование этого идентификатора сеанса будет регенерировано, но мой вопрос: в чем вообще разница между session.clear () и session.abandone (). таким образом, когда для autoregenerate установлено значение false, эти буксировки не отличаются ни от чего другого, повышающего Sesion_End?
бэкдор
3

clear - удалить ключ или значения из коллекции состояния сеанса.

отказаться от него удалить или удалить объекты сеанса из сеанса ..

Maxy
источник
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 и немедленного выполнения некоторой логики с сеансом.

Бики
источник