C # Очистить сессию - PullRequest
50 голосов
/ 10 июля 2011

Вопрос № 1

Я хочу знать, когда я должен использовать:

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

И когда я должен использовать:

Session.Clear ()

Когда мне следует использовать каждый конкретный метод?


  • В целом?
  • В моем конкретном случае?

Я проверяю, не равен ли сеанс нулю в Page Load.Если сессия равна нулю, я хочу очистить сессию и перенаправить на страницу входа?

Должен ли я использовать что-то вроде этого:

private void initSession()
{
    Session.Clear();
    Session.Abandon();
    Response.Redirect("LoginPage.aspx");
}

Ответы [ 3 ]

94 голосов
/ 10 июля 2011

В ASP.NET, когда мне следует использовать Session.Clear () вместо Session.Abandon ()?

Session.Abandon () уничтожает сеанс иСобытие Session_OnEnd инициируется.

Session.Clear () просто удаляет все значения (содержимое) из объекта.Сеанс с тем же ключом все еще жив.

Итак, если вы используете Session.Abandon (), вы потеряете этот конкретный сеанс, и пользователь получит новый ключ сеанса.Вы можете использовать его, например, когда пользователь выходит из системы.

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

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

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

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

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

...

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

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

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

Session.Clear () или Session.Abandon ()?

Вы используете Session.Clear (), когда вы не хотите завершать сеанс, а просто очищаете все ключи в сеансе и повторно инициализируете сеанс.

Session.Clear () не вызоветобработчик события Session_End в вашем файле Global.asax для выполнения.

Но с другой стороны Session.Abandon () полностью удалит сеанс и выполнит обработчик события Session_End.

Session.Clear ()это все равно, что убрать книги с книжной полки

Session.Abandon () это все равно что бросить книжную полку.

Вопрос

Я отмечаю нанекоторые сеансы, если они не равны нулю при загрузке страницы.если один из них равен нулю, я хочу очистить все сеансы и перенаправить на страницу входа?

Ответ

Если вы хотите, чтобы пользователь снова вошел в систему, используйте Session.Abandon.

3 голосов
/ 29 июня 2015

Другое большое отличие состоит в том, что Abandon не удаляет элементы сразу, но когда он затем выполняет очистку, он выполняет цикл по элементам сеанса, чтобы проверить наличие COM-объектов STA, которые он должен обрабатывать специально. И это может быть проблемой.

При высокой нагрузке возможно два (или более) запроса сделать это на сервер для одного и того же сеанса (то есть два запроса с одним и тем же сеансом)печенье).Их выполнение будет сериализовано, но, поскольку Abandon не удаляет элементы синхронно, а устанавливает флаг, возможно выполнение обоих запросов и обоих запросов для планирования рабочего элемента для очистки сеанса «позже».Оба этих рабочих элемента могут затем выполняться одновременно, и оба проверяют объекты сеанса, и оба очищают массив объектов, и что происходит, когда у вас есть две вещи, перебирающие список и изменяющие его ??Boom!И так как это происходит при обратном вызове queueuserworkitem и НЕ выполняется в try / catch (спасибо MS), это приведет к разрушению всего домена приложения.Был там.

3 голосов
/ 11 июля 2011

Нашел эту статью в сети, очень актуально для этой темы.Так что постить сюда.

Внутренние компоненты ASP.NET - очистка переменных сеанса ASP.NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...