C# Очистить Сеанс

Вопрос № 1

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

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

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

сессии.Clear ()

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


  • In генерал?
  • в моем конкретном случае?

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

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

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

3 ответов


In ASP.NET, когда я должен использовать сеанс.Clear () вместо сеанса.Отказаться ()?

сессии.Abandon () уничтожает сеанс и событие Session_OnEnd вызванный.

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

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

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

в чем разница между сессии.Отказаться () и сеанс.Clear ()

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

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

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

...

вообще, в большинстве случаев вам нужно используйте сеанс.Четкий. Вы можете использовать Сессия.Отказаться, если вы уверены, что пользователь собирается покинуть сайт.

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

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

сессии.Очистить () или сеанс.Отказаться ()?

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

сессии.Clear() не вызовет Session_End eventhandler в вашем Глобальный.asax файл для выполнения.

но с другой стороны Сессия.Abandon () удалит сессия вообще и будет выполнять EventHandler в Session_End.

сессии.Clear () - это как удаление книг с книжной полки!--3-->

сессии.Abandon () - это как бросать сама Книжная полка.

вопрос

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

ответ

Если вы хотите пользователь для входа в систему снова используйте Session.Оставлять.


нашел эту статью в сети, очень актуальную для этой темы. Поэтому разместите здесь.

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


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

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