我正在开发一个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
,这是有道理的,因为我的Global.asax.cs中永远不会调用Session_End方法。我错过了什么?
答案 0 :(得分:2)
我这样做:
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 :(得分:1)
这是我最终实施的内容。
在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;
}
}