Время сеанса в веб-приложении ASP.NET не истекло - PullRequest
4 голосов
/ 28 июня 2011

Я занимаюсь разработкой приложения ASP.NET 3.5 WebForms, в котором я хотел бы, чтобы сессия прерывалась по истечении определенного периода времени.После чего, если пользователь пытается что-то сделать, приложение должно перенаправить их на страницу, сообщающую, что время сеанса истекло, и что ему нужно будет начать сначала.Насколько мне известно, довольно стандартные вещи.

Однако я не могу установить тайм-аут сеанса для проверки этой функциональности, будь то в Visual Studio или IIS.Вот мои настройки состояния сеанса в web.config:

<sessionState mode="SQLServer"
              allowCustomSqlDatabase="true"
              sqlConnectionString="<ConnectionString>"
              cookieless="false"
              timeout="1" />

Вот как я тестирую время ожидания сеанса:

public bool IsSessionTimeout
{
    get
    {
        // If the session says its a new session, but a cookie exists, then the session has timed out.
        if (Context.Session != null && Session.IsNewSession)
        {
            string cookie = Request.Headers["Cookie"];
            return !string.IsNullOrEmpty(cookie) && cookie.IndexOf("ASP.NET_SessionId") >= 0;
        }
        else
        {
            return false;
        }
    }
}

Похоже, что Session.IsNewSession всегда возвращает false,что имеет смысл, потому что метод Session_End никогда не вызывается в моем Global.asax.cs.Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Я делаю это:

        if (Session["myUser"] != null)
            myUser = (User)Session["myUser"];
        else
            myUser = null;

        //User must be logged in, if not redirect to the login page - unless we are already running the login page.
        if ((myUser == null) && (Request.Url.AbsolutePath != "/Login.aspx"))
            Response.Redirect("Login.aspx?Mode=Timeout", true);

в page_init моей главной страницы для одного из моих сайтов. Вы можете легко адаптировать его к тому, что вы хотите. В основном, проверьте, есть ли что-то, что должно существовать в сеансе, и если это не так, у вашего сеанса истекло время ожидания, и вы можете предпринять соответствующие действия.

В моем случае они перенаправляются на страницу входа. В вашем случае, когда они запускают ваш «процесс», вы устанавливаете переменную сеанса. При каждом запросе страницы проверяйте, существует ли этот элемент в сеансе.

1 голос
/ 28 июня 2011

Вот что я в итоге реализовал.

В Global.asax.cs:

protected void Session_Start(object sender, EventArgs e)
{
    Session[SessionKeys.SessionStart] = DateTime.Now;
}

В базовом классе моих страниц:

public bool IsSessionTimeout
{
    get
    {
        DateTime? sessionStart = Session[SessionKeys.SessionStart] as DateTime?;
        bool isTimeout = false;

        if (!sessionStart.HasValue)
        {
            // If sessionStart doesn't have a value, the session has been cleared, 
            // so assume a timeout has occurred.            
            isTimeout = true;
        }
        else
        {
            // Otherwise, check the elapsed time.
            TimeSpan elapsed = DateTime.Now - sessionStart.Value;
            isTimeout = elapsed.TotalMinutes > Session.Timeout;
        }

        Session[SessionKeys.SessionStart] = DateTime.Now;
        return isTimeout;
    }
}
...