0

我正在开发一个由 .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

说明:无法加载视图状态。正在加载视图状态的控制树必须与在上一个请求期间用于保存视图状态的控制树相匹配...

堆栈跟踪的重要部分是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 方法中吗?)

4

3 回答 3

2

我认为您需要使用一些客户端脚本来执行此操作。尽管 Session_End 会触发,但如果用户没有先执行某些操作(即发送请求),Web 服务器实际上无法将 Session 超时消息传递给浏览器。因此,您必须让一些定时客户端脚本启动它.

于 2010-04-27T02:11:07.583 回答
1

类似于 javascript 的 setTimeout 函数。

例如在页面加载功能中

setTimeout("redirect()", 1500000); //25分钟超时

如果您的页面上有任何 AJAX,您应该清除超时并在新内容加载时重新开始。

于 2010-07-16T12:29:09.413 回答
1

更简单的是使用 Html 元标记“刷新”。以下行将在页面加载 5 分钟后触发:

<meta http-equiv="refresh" content="300;url=http://domain.org/Logout.aspx" />

也许这就是你需要的。

于 2010-07-18T13:49:08.753 回答