Session_End не срабатывает? - PullRequest
23 голосов
/ 27 января 2011

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

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

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

Ответы [ 5 ]

41 голосов
/ 17 января 2013

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

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

6 голосов
/ 27 января 2011

В вашем файле web.config вы должны иметь элемент sessionState в качестве дочернего элемента

<configuration>
     <system.web>
          <sessionState mode="InProc" />
          .....
     </system.web>
</configuration>
5 голосов
/ 09 апреля 2012

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

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

Так что вам нужнообъявить Session_Start для перехвата Session_End:)

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

protected void Session_End(Object sender, EventArgs e) {
  Debug.WriteLine("End. " + Session.SessionID);
}
1 голос
/ 27 января 2011

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

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

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

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

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

0 голосов
/ 11 июня 2015

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

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

Позвоните по этому номеру

  Application_Start() Event

  SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...