我正在尝试在我的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。这仅适用于第一个请求,然后始终为false。我将超时设置为1分钟。会议似乎永远不会超时。我在这里缺少什么?
此外,我在SQL Server 2008中实现了一个状态服务器。这不是进程内会话状态实现。
提前致谢。
答案 0 :(得分:2)
由于您在global.asax文件中有Session_start事件,因此会话到期后,会再次触发Session_start。这意味着会话ID已经创建,因此oninit事件IsNewSessionId将返回false,因为已经创建了会话ID。
因此删除Session_Start事件将起作用。
如果此解决方案适合您,请告诉我。
答案 1 :(得分:0)
根据用户对服务器的第一次请求启动ASP.Net会话。这是IsNewSession
唯一真实的时间。
调用Session.Abandon()删除当前会话,然后如果将用户重定向到SessionExpired页面,则会启动新会话。
我不确定为什么超时不会被解雇。您是否已将代码放入Global.asax Session_End事件中以验证会话是否未结束?
答案 2 :(得分:0)
在您的应用程序中,如果没有Session_Start事件,则每次IsNewSession
为每次回发都返回true,除非您在会话中存储一些值。
一旦你在会话中存储了一些值,IsNewSession
下次即使很多回发也会返回false。
会话到期后,IsNewSession
将返回true,直到没有会话存储。