我正在开发一个由.NET asp / C#代码驱动的网站。客户端要求会话超时25分钟。但是,有时会使用该站点,并且用户长时间保持连接(超过25分钟)。 Session_End被触发:
protected void Session_End(Object sender, EventArgs e)
{
Hashtable trackingInformaiton = (Hashtable)Application["trackingInformation"];
trackingInformaiton.Remove(Session["trackingID"]);
}
用户稍后返回,但当他们与网站互动时,他们会收到错误,我们会收到此电子邮件通知:
用户:未经身份验证的用户
错误:System.Web.HttpException
描述:无法加载viewstate。加载viewstate的控制树必须与上一个请求期间用于保存viewstate的控制树相匹配...
堆栈跟踪的告诉部分是System.Web.UI.Control.AddedControl
。显然,服务器丢弃了会话数据,并且正在发送新数据,但客户端正在尝试处理旧数据。因此"the control tree into which viewstate is being loaded [doesn't] match the control tree that was used to save the viewstate during the prevoius request."
所以这是问题。当连接超时时,我如何强制指示用户的浏览器重定向到“你已注销”屏幕? (这是我应该添加到Session_End方法的吗?)
答案 0 :(得分:2)
我认为您需要使用一些客户端脚本来执行此操作。尽管Session_End触发,但Web服务器实际上无法向浏览器传送会话超时消息,而用户不会首先执行某些操作(即发送请求。)因此,您必须有一些定时客户端脚本启动
答案 1 :(得分:1)
类似于javascript的setTimeout函数。
e.g。 在页面上载函数
setTimeout(“redirect()”,1500000); // 25分钟超时
如果您的网页上有任何AJAX,则应清除超时并在新内容加载时重新开始。
答案 2 :(得分:1)
更简单的是使用Html元标记“刷新”。加载页面后5分钟将触发以下行:
<meta http-equiv="refresh" content="300;url=http://domain.org/Logout.aspx" />
也许这就是你需要的。