除颤器:无限期保持 ASP.NET 会话






4.68/5 (52投票s)
2005年5月31日
4分钟阅读

372815
只需两行代码(不开玩笑),就能让您的会话在用户停留在您的网站上时保持活动状态。
除颤器介绍
有时,您只想在用户停留在网站上或关闭浏览器时保持会话处于活动状态。 在这种情况下,您没有安全要求使这成为一个坏主意。 您只是想减少会话超时,但只要人们在您的网站上(不仅仅是回发到服务器),就让它持续存在。 当我告诉你我已经找到了一种用两行代码做到这一点的方法时,我没有开玩笑。
来自生物医学工程背景,我不得不简单地称这个构造为除颤器:-) 您很快就会明白为什么。
螺母和螺栓
最优雅的工程解决方案是最简单的。 您将问题分解为最精细的组成部分,然后专注于将您广博的知识应用于每个组成部分,以产生统一的解决方案。
这个解决方案只有四个概念
- 了解响应。
- 了解
Refresh
HTTP 标头属性。 - 会话属性访问。
- 普通的 IFrame。
您将创建一个名为Defibrillator.aspx的虚拟 WebForm。 除了在代码隐藏文件的Page_Load
上添加一行之外,您无需对该页面执行任何操作
private void Page_Load(object sender, System.EventArgs e)
{
Response.AddHeader("Refresh", Convert.ToString((Session.Timeout*60)-10));
}
您只是将 Refresh
HTTP 标头属性添加到 WebForm,并为其指定了会话超时时间减去十秒的值。 这是什么意思? 这意味着在用户的会话即将超时之前的十秒钟,只要他们打开了一个浏览器,并且他们在您的页面上,这个除颤器页面就会向您的服务器传递大量的电流,将用户的会话从死亡的边缘拉回来......这也可以描述为自动回发以保持会话处于活动状态:-)。
太好了,你说...我不希望我的网站可见地回发只是为了保持会话处于活动状态。 你不必这样做。 这就是第二行代码的用武之地。
进入您的网站持久用户控件,例如页眉或页脚用户控件。 现在将这行代码添加到前端 WebForm 标记语言中
<IFRAME id=Defib src="/Defibrillator.aspx"
frameBorder=no width=0 height=0 runat="server"></IFRAME>
现在这个不可见的除颤器 WebForm 将只是坐在 IFrame 中,并在会话超时前 10 秒将其自身回发到服务器,前提是他们仍然在您的网站上或浏览器已打开。 查看源代码,您甚至看不到 Refresh
属性,因为它挂在不可见的 IFrame 中。
请谨慎使用这个聪明的小技巧,并了解您的刀片资源,否则我将拥有一支网络管理员军队准备好攻击我的堡垒:-)
注意事项
- 浏览器兼容性
它将在任何解释
Refresh
HTTP 标头的浏览器中工作。 在 Netscape 中,它的作用是在指定时间点击“重新加载”。 我在网上读到,此刷新将从搜索引擎抓取中排除您的页面......这很好,因为您将此功能标记放在 IFrame 中的虚拟页面上,您不希望任何人浏览到该页面。 - 超出我们的控制:ASP.NET 在服务器上的超时精度。
我发现 ASP.NET 中的会话超时本身并不完全准确,尤其是在您处于调试过程中时。 虽然我还没有遇到
Session.Timeout
- 10 秒的除颤器故障,但我使用Session.Timeout
- 5 秒测试了 2 天,并且在 36.5 小时的不活动时间左右失败了,因为 ASP.NET 会话在服务器上应该超时之前超时了。 您可能需要记住这一点并执行您自己的小测试。 您甚至可以启动不同的浏览器并让它们运行,在 DB 中记录故障时间和来自 Request 的浏览器类型。 到目前为止,在我的应用程序上一切顺利,在我在此处在 Netscape 或 IE 6 上呈现解决方案的方式上没有问题。 (回复:Joe)。
Extension
在除颤器中编写代码组合,该代码在 JavaScript 计时器上运行,提示用户刷新会话,并将 Refresh
HTTP 标头属性替换为此构造。 由于它是站点持久性的,因此尽可能多地将 JavaScript 放入您的.js 文件中。 (回复:Fredrik)