Проблема тайм-аута состояния сеанса ASP.NET

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

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. Это не реализация состояния сеанса в процессе.

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


person user314827    schedule 13.04.2010    source источник


Ответы (3)


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

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

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

person Vikas    schedule 01.12.2011

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

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

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

person womp    schedule 13.04.2010
comment
Итак, вы говорите, что IsNewSession всегда будет ложным после первого запроса? Таким образом, по сути, даже если сеанс прервет тайм-аут, приведенный выше код не будет работать, потому что IsNewSession всегда будет ложным, и у кода никогда не будет возможности войти и выполнить Session.Abandon, когда сеанс действительно истекает? - person user314827; 14.04.2010
comment
IsNewSession будет иметь значение true только для HttpRequest, вызвавшего создание нового объекта сеанса. Я считаю, что первый запрос к серверу после тайм-аута должен сделать это. - person womp; 14.04.2010
comment
Также я реализовал сервер состояний в SQL Server 2008. Это не реализация состояния сеанса в процессе. - person user314827; 14.04.2010

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

Как только вы сохраните какое-то значение в сеансе, IsNewSession вернет false в следующий раз, даже если многие отправят ответ.

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

person Vikas    schedule 01.12.2011