检测ASP.NET会话超时 - ASP.NET_SessionId方法无法正常工作

时间:2013-05-03 09:48:55

标签: asp.net session session-cookies

我正在尝试检测Asp.NET Session Timeout以将用户重定向到超时页面;我检查了各种方法,其中大多数类似于

http://aspalliance.com/520_Detecting_ASPNET_Session_Timeouts.2

(如果Session.IsNewSessionASP.NET_SessionId cookie存在,则为超时)

问题是“ASP.NET_SessionId”cookie始终存在,即使我刚刚开始调试,因此在第一次启动网站时总是给我一个错误的超时标记。

更新: 为了测试,我刚刚创建了一个空的Asp.NET Web应用程序,其中包含以下代码:

BasePage.cs

using System;
using System.Web.UI;

namespace TestApp.classes
{
    public class BasePage : Page
    {
        protected override 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))
                    {
                        Response.Redirect("sessionTimeout.htm");
                    }
                }
            }
        }
    }
}

Global.asax中

using System;

namespace TestApp
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {

        }

        protected void Session_Start(object sender, EventArgs e)
        {
            var a = "";
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {
            var b = "";
        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

WebForm1.aspx的

using System;
using TestApp.classes;

namespace TestApp
{
    public partial class WebForm1 : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

的Web.config

<?xml version="1.0"?>
<configuration>
    <system.web>
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
      <sessionState timeout="1"></sessionState>
    </system.web>

</configuration>

然后点击F5,我将被重定向到sessionTimeout.htm。为什么呢?

1 个答案:

答案 0 :(得分:0)

开发网站时不必使用cookie。存在其他存储数据的方式,例如您可以在数据库中存储特定于用户的数据

请注意"Cookieless = false"SessionState元素的web.config attrubute,这意味着当前会话的sessionID将作为Cookie保存在客户端计算机中

<sessionState cookieless="true" />

ASP.NET会话状态的默认设置在machine.config文件中定义,可以在应用程序根文件夹的web.config文件中覆盖。通过确保上述行出现在根web.config文件中,您可以启用无Cookie会话

参考http://msdn.microsoft.com/en-us/library/aa479314.aspx

因此请仅检查Session.IsNewSession并禁用Cookie