Большое количество Session_Start с одинаковым идентификатором сессии - PullRequest
5 голосов
/ 10 февраля 2010

Я использую веб-сайт ASP.NET на своем компьютере для разработки (.NET 2.0 в Vista / IIS7). Метод Session_Start в global.asax.cs регистрирует каждый вызов файла (log4net). Метод Session_End также регистрирует каждый вызов.

Я использую состояние сеанса InProc и устанавливаю время ожидания сеанса на 5 минут (чтобы избежать ожидания в течение 20 минут).

Я зашел на сайт, подожди 5 минут, я увижу журнал Session_End. Тогда я F5 сайт. В браузерах по-прежнему есть сеансовый файл cookie и он отправляется на сервер. Session_Start вызывается, и новый сеанс создается с использованием того же идентификатора сеанса (кстати: мне нужно, чтобы это был тот же идентификатор сеанса, поскольку он используется для хранения данных в базе данных).

Результат: Каждый раз, когда я нажимаю F5 в ранее завершенном сеансе, вызывается метод Session_Start, выполняется запрос, и немедленно вызывается метод Session_End.

Когда я открываю другой браузер, метод Session_Start вызывается только один раз. Затем через 5 минут Session_End каждый F5 вызывает выполнение последовательности Session_Start / request / Session_End.

Соответствующий раздел web.config:

<system.web>
  <compilation debug="true" />
  <sessionState timeout="2" regenerateExpiredSessionId="false" />
</system.web>

1 Ответ

6 голосов
/ 28 августа 2011

Параметр regenerateExpiredSessionId относится только к URL-адресам без файлов cookie , он не влияет на поведение файла cookie сеанса, который будет использоваться повторно.

Проблема, с которой вы столкнулись, связана с тем, как ASP.NET 2.0 / 3.5 обрабатывает сеансы в зависимости от того, используется ли он. В обычных обстоятельствах он не пытается сохранить сеанс до тех пор, пока он не будет использован в первый раз, и поэтому не выдает файл cookie сеанса (если он не существует). Первый сеанс времени используется , на сервере создается сеанс и выдается файл cookie сеанса.

Теперь, когда предыдущий сеанс перезапускается, но не используется, ASP.NET немного запутывается. Он пытается немедленно прекратить неиспользованный (перезапущенный) сеанс, так как он не требуется, что вызывает ранний Session_End. Однако он не удаляет ранее существующий файл cookie сеанса, и, следовательно, каждый последующий запрос повторяет последовательность, перезапуская и затем завершая сеанс, пока файл cookie не будет удален или сеанс не будет использован.

В .Net 4.0 это поведение изменилось, и в этом случае событие больше не вызывается.

...