Подтвердить что ты не робот

Session_End не срабатывает?

Я хочу выпустить пользователя, когда его сеанс истекает. Поэтому используется следующий код в Global.asax:

protected void Session_End(object sender, EventArgs e)
{
    FormsAuthentication.SignOut();
}

Но кажется, что session_end никогда не срабатывает. Любая идея, как это исправить? Я использую ASP.NET с настройками по умолчанию.

4b9b3361

Ответ 1

Вы можете установить некоторые данные сеанса в Session_Start. Без этого Session_End не будет запущен. см. this

Также очень важно отметить, что если вы ничего не сохраняете в сеансе, событие Session_End не срабатывает. Должно быть что-то сохранено в сеансе, по крайней мере один раз, для запуска события Session_End. Это также означает, что если вы сохранили что-то в сеансе в первом запросе и отказались от сеанса в том же запросе, событие Sesison_End не будет срабатывать, поскольку в сеансе ничего не было сохранено.

Ответ 2

В вашем web.config вам нужно, чтобы элемент sessionState был дочерним элементом элемента

<configuration>
     <system.web>
          <sessionState mode="InProc" />
          .....
     </system.web>
</configuration>

Ответ 3

Я не знаю, это особенность или ошибка. Или, может быть, я недостаточно понимаю управление сеансом в ASP.NET. Но это то, что я нашел.

Session_End не запускается в ASP.NET MVC 4 (с настройками по умолчанию для элемента sessionState в web.config), если Session_Start не объявлен.

Итак, вам нужно объявить Session_Start для catch Session_End:)

protected void Session_Start(Object sender, EventArgs e) { }

protected void Session_End(Object sender, EventArgs e) {
  Debug.WriteLine("End. " + Session.SessionID);
}

Ответ 4

Вы уверены, что он никогда не срабатывает?

Как я понимаю, Session_End не имеет никакого отношения к текущему запросу, потому что сеанс ASP.NET завершается таймаутом ПОСЛЕ того, как последний запрос от клиента пришел. Вызов FormsAuthenticaion.SignOut управляет куки-аутентификацией и, следовательно, не имеет никакого эффекта без какой-либо связи с клиентом (браузером).

Взгляните на этот вопрос (у которого есть ответ) - проблема более или менее похожа на вашу, поэтому вы можете найти правильное решение:

Session_End в Global.asax.cs не запускается с использованием проверки подлинности форм

Надеюсь, что это поможет.

Ответ 5

Я не знаю, как это работает, но он срабатывает, когда я закрываю браузер после периода ожидания.

  public void Session_End(Object sender, SessionEndedEventArgs e)
  {
  }

Вызвать это из

  Application_Start() Event

  SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End);