ASP.NET Session_End вызывается сразу после Session_Start после истечения времени ожидания сеанса - PullRequest
3 голосов
/ 30 марта 2009

У меня есть обработчики для моих событий Session_Start и Session_End. При первом запуске приложения все отлично работает. Если я покидаю сессию и происходит стандартный тайм-аут, я наблюдаю мой бросок Session_End. Я ожидаю такого поведения.

Допустим, я вернусь после тайм-аута и обновлю страницу. Метод Session_Start запускается, но затем сразу же запускается метод Session_End. Я ожидаю еще 15 минут бездействия между Session_Start и Session_End.

В чем проблема?

РЕДАКТИРОВАТЬ: Да, тот же идентификатор сессии.

РЕДАКТИРОВАТЬ 2: Cookies выглядят так, как будто они должны истечь в конце сессии. Не уверен, почему я продолжаю получать этот цикл Session_Start / Session_End. Я также попытался вызвать Session.Abandon () из Session_End, но это не сработало. Это работает и на сервере разработки ASP.NET. Я еще не пробовал это на реальном сервере IIS.

Ответы [ 5 ]

4 голосов
/ 04 марта 2010

Немного поздно отвечать, но это может быть полезно для других пользователей, у которых возникла та же проблема. Я столкнулся с тем же поведением, что и вы: Session_Start() и Session_End() вызываются для каждого запроса после первый тайм-аут и SessionID всегда одинаковы:

  1. Я запустил тот же код с ASP.NET 4.0, и проблема исчезла.

  2. В качестве обходного пути в ASP.NET 2.0 / 3.5 просто поместите что-нибудь в коллекцию сеансов (Session["dummy"] = "dummy"), и Session_Start() и Session_End() будут вести себя нормально.

1 голос
/ 18 мая 2012

Для тех, у кого такая же проблема. Ответ, данный Алексеем Б., спас меня.

Это больше не происходит в 4.0, но если вы помещаете что-то в Session в обработчик Session_Start, это обрезает круг Session_Start -> Session_End, и вам даже не нужно удалять куки.

1 голос
/ 30 марта 2009

.Net делает некоторые забавные вещи со своими сессионными куки, особенно в сочетании с формами аутентификации. Я просто догадываюсь, но я думаю, что клиент зависает от cookie и повторно отправляет его на сервер даже после того, как он недействителен, что (я предполагаю здесь) может вызвать перезапуск сеанса, в этот момент он распознает, что он недействителен, и удаляет его, вызывая завершение сеанса.

Попытка:

  1. Проверка правильности срока действия файлов cookie
  2. Вызов Session.Abandon () и FormsAuthentication.SignOut ()

Не уверен, что это поможет, но FWIW.

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

Это дубликат этого вопроса .

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

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

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

0 голосов
/ 30 марта 2009

Можете ли вы проверить, что события запускаются для одного и того же идентификатора сеанса?

...