2010-04-13 3 views
0

Я пытаюсь обнаружить тайм-аут состояния сеанса в моем приложении asp.net и не могу этого сделать. У меня есть базовый класс, производный от System.Web.UI.Page следующим образом: -Задача тайм-аута состояния сеанса ASP.NET

public class BasePageSessionExpire : Page 
{ 
    override protected void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     if (Context.Session != null) 
     {     
      if (Session.IsNewSession) 
      {      
       string szCookieHeader = Request.Headers["Cookie"]; 
       if ((null != szCookieHeader) && (szCookieHeader.IndexOf("ASP.NET_SessionId") > 0)) 
       { 
        Session.Abandon(); 
        Response.Redirect("~/SessionExpired.aspx",true); 
       } 
      } 
     } 
    } 
} 

Все страницы мне нужно проверить состояние сеанса на проистекают из этого базового класса вместо «System.Web.UI.Page ». Кроме того, все эти страницы имеют EnableSessionState = «True». У меня есть пустой метод Session_Start() в файле global.asax, если это вообще актуально.

По какой-то причине после первого запроса свойство Session.IsNewSession всегда является ложным. Это верно только для первого запроса, а затем всегда является ложным. У меня установлен тайм-аут 1 минута. Сессия никогда не кажется таймаутом. Что мне здесь не хватает?

Также я реализовал государственный сервер в SQL Server 2008. Это не реализация состояния сеанса в proc.

Заранее спасибо.

ответ

0

Сессия ASP.Net запускается с первого запроса пользователя на сервер. Это единственный раз, когда IsNewSession будет правдой.

Вызов Session.Abandon() удаляет текущий сеанс, а затем, если вы перенаправляете пользователя на страницу SessionExpired, это запустит новый сеанс.

Я не уверен, почему тайм-аут не будет стрелять. Вы помещаете код в событие Global.asax Session_End, чтобы проверить, что сеансы не заканчиваются?

+0

Значит, вы говорите, что IsNewSession всегда будет ложным после первого запроса? Таким образом, даже если сеанс сделал тайм-аут, код выше не будет работать, потому что IsNewSession всегда будет ложным, и код никогда не получит шанс зайти и выполнить «Session.Abandon», когда сеанс действительно заканчивается таймаутом? – user314827

+0

IsNewSession будет действительным только для HttpRequest, который вызвал создание нового объекта сеанса. Первый запрос на сервер после таймаута должен сделать это, я считаю. – womp

+0

Также я реализовал государственный сервер в SQL Server 2008. Это не реализация состояния сеанса в proc. – user314827

2

Поскольку у вас есть событие Session_start в файле global.asax, по истечении сеанса Session_start снова запускается. это означает, что идентификатор сеанса уже создан, и поэтому oninit событие IsNewSessionId вернет false, поскольку идентификатор сеанса уже создан.

Так что удаление события Session_Start будет работать.

Дайте мне знать, если это решение будет работать на вас.

0

В вашем приложении, если нет события Session_Start, тогда каждый раз, когда IsNewSession вернет true для каждой обратной передачи, пока вы не сохраните некоторое значение в сеансе.

После того, как вы сохраните некоторое значение в сеансе, IsNewSession вернет false в следующий раз даже много сообщений.

Как только сессия закончится, IsNewSession вернет true до тех пор, пока не будет сохранено хранилище сеансов.