0

我试图在我的 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"。如果相关的话,我的 global.asax 文件中有一个空白的 Session_Start() 方法。

出于某种原因,在第一次请求之后,“Session.IsNewSession”属性始终为 false。仅对第一个请求为真,然后始终为假。我将超时设置为 1 分钟。会话似乎永远不会超时。我在这里想念什么?

我还在 SQL Server 2008 中实现了一个状态服务器。这不是进程内会话状态实现。

提前致谢。

4

3 回答 3

2

由于您在 global.asax 文件中有 Session_start 事件,因此在会话到期后, Session_start 再次触发。这意味着会话 ID 已经创建,因此 oninit 事件 IsNewSessionId 将返回 false,因为会话 ID 已经创建。

因此删除 Session_Start 事件将起作用。

让我知道此解决方案是否适合您。

于 2011-12-01T03:44:00.533 回答
0

在您的应用程序中,如果没有 Session_Start 事件,那么每次IsNewSession回发都会返回 true,除非您在会话中存储了一些值。

一旦你在会话中存储了一些值,IsNewSession下次甚至很多回发时都会返回 false。

一旦会话过期,IsNewSession将返回 true 直到没有会话存储。

于 2011-12-01T03:48:15.820 回答
0

ASP.Net 会话在用户第一次请求服务器时启动。这是唯一IsNewSession真实的时间。

调用 Session.Abandon() 删除当前会话,然后如果您将用户重定向到 SessionExpired 页面,这将启动一个新会话。

我不确定为什么超时不会触发。您是否在 Global.asax Session_End 事件中添加了代码来验证会话没有结束?

于 2010-04-13T20:36:01.767 回答