Почему объекты сеанса не удаляются после периода ожидания в Asp.Net? - PullRequest
3 голосов
/ 08 февраля 2011

Почему объекты сеанса не удаляются после периода ожидания?

Я использую Asp.Net 4.0, и состояние сеанса настроено, как показано ниже.

<sessionState mode="SQLServer" cookieless="false" timeout="5"
                  allowCustomSqlDatabase="true" 
                  sqlConnectionString="data source=.\SqlExpress;initial catalog=App_SessionState;user id=sa;password=xxxxxxxx"/>

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

РЕДАКТИРОВАТЬ:

Если я получу доступ к переменной сеанса через 10 минут, как показано ниже, я не получу NULL

  var myObj = Session["MyKey"] as MyClass;

mObj не равен NULL через 10 минут.

Ответы [ 3 ]

6 голосов
/ 08 февраля 2011

Установлена ​​хранимая процедура с именем DeleteExpiredSessions, которая вызывается из задания ASPState_Job_DeleteExpiredSessions и выполняется каждую минуту (если я правильно прочитал файл InstallSqlState.sql).

Процедура обычно вызывает DELETE FROM ASPStateTempSessions WHERE Expires < GETUTCDATE()

Итак, если объекты не удалены, проверьте столбец Expires и убедитесь, что вы сравниваете с датой utc .Если сомневаетесь, сделайте SELECT * FROM ASPStateTempSessions WHERE Expires < GETUTCDATE().Также убедитесь, что ваш ASPState_Job_DeleteExpiresSessions включен и работает.

Быстрая (и полностью неподтвержденная идея);SQL Server Express поставляется с агентом SQL?Включено ли оно и может ли оно выполнять запланированные задания?

2 голосов
/ 08 февраля 2011

«Сессия» никогда не бывает «нулевой», но после истечения времени ожидания объект сеанса очищается (или повторно создается), автоматически запускается другой сеанс (это можно проверить, обработав события SessionEnd и SessionStart),и у вас всегда будет ссылка на объект сеанса.Не бывает?Вы все еще видите данные предыдущей сессии?

0 голосов
/ 08 февраля 2011

Чтобы добавить к сказанному Саймоном: если не запущен агент SQL Server, не будет очистки значений сеанса, если только не будет выполнена хранимая процедура внутри базы данных.
Я не думаю, что SQL Server Express имеет агента, поэтому автоматическая работа невозможна.

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

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

Вы можете использовать сеансы InProc, которые очищаются автоматически. Но я предположил, что, поскольку InProc используется по умолчанию, есть причина, по которой вы переключились на SQL Server.

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