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

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

Я искал этот вопрос, но не понимаю полного ответа. Некоторые ответы:

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

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

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

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

Нижеприведенный код работает и не генерирует никаких исключений.

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

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

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

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

Ответ 1

Clear - Удаляет все ключи и значения из коллекции состояний сеанса.

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

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

Вы говорите:

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

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

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

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

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

  • Abandon вызывает запрос Session_End.
  • Очистить удаляет элементы, Abandon не делает.
  • Abandon освобождает объект SessionState и его элементы, чтобы он мог собрать мусор, чтобы освободить ресурсы. Clear сохраняет SessionState и связанные с ним ресурсы.

Ответ 2

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

Ответ 3

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

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

Session.Abandon() НЕ будет очищать значения текущего запроса. Если запрашивается другая страница, значения для нее исчезнут. Тем не менее, отказаться от WILL бросить событие.

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

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

из MSDN Session.Abandon

Ответ 7

Существование sessionid может привести к тому, что атака фиксации сеанса является одной из точек соответствия PCI. Чтобы удалить сеанс и устранить атаку фиксации сеанса, прочитайте это решение - Как избежать уязвимости фиксации сеанса в ASP.NET?.

Ответ 8

Я думаю, было бы удобно использовать Session.Clear() вместо использования Session.Abandon().

Поскольку значения все еще существуют в сеансе после вызова позже, но удаляются после вызова первого.

Ответ 9

Session.Abandon() 

уничтожит/уничтожит весь сеанс.

Session.Clear()

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

Сравнение с методом Session.Abandon(), Session.Clear() не создает новый сеанс, он просто превращает все переменные в сеансе в NULL.

Идентификатор сеанса останется таким же в обоих случаях, если браузер не закрыт.

Session.RemoveAll()

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

Session.Remove()

Он удаляет элемент из коллекции состояний сеанса.

Session.RemoveAt()

Он удаляет элемент по указанному индексу из коллекции состояний сеанса.

Session.TimeOut()

Это свойство определяет период ожидания, назначенный объекту Session для приложения. (время будет указано в минутах).

Если пользователь не обновляет или не запрашивает страницу в период таймаута, сеанс заканчивается.

Ответ 10

this code works and dont throw any exception:

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

Здесь следует отметить, что Session.Clear удаляет элементы немедленно, но Session.Abandon отмечает сеанс, который должен быть оставлен в конце текущего запроса. Это просто означает, что предположим, что вы пытались получить доступ к значению в коде сразу после выполнения команды session.abandon, он все равно будет там. Поэтому не путайте, если ваш код просто не работает даже после выдачи команды session.abandon и сразу же выполняет некоторую логику с сеансом.