在IIS 7.5上的ASP.NET中,如何在一段时间后(比如5小时)关闭会话,即使用户仍在工作且没有空闲时间?
IIS中是否有属性,还是应该在代码中执行?
答案 0 :(得分:0)
我之前没有尝试过这样的解决方案,但这是我想到的:
在global.asax
句柄SessionStart
中,当新会话开始时,创建一个启动计时器的新(异步)任务(计时器在5小时后执行一次并调用Session.Abandon() :
这样的事情:
new Task(()=>{
var timer=new Timer{Interval=DateTime.Now.AddHours(5), Elpased+=(obj,args)=>{
session.Abandon();
((Timer)obj).Stop();
((Timer)obj).Dispose();
}
}).Start()
正如我告诉过你的那样,我没有对它进行测试,因为一切都在这里异步工作,可能导致未知情况。
(BTW据我所知,计时器已经在另一个线程中运行,所以不需要任务:))
<强>更新强>
好的,似乎我们无法持有对HtmlStateSession的引用。因此,这是另一种方法,我认为它可以提供帮助:在这种方法中,我们在静态字典中保存会话ID和每个会话的开始时间的注册,当请求开始时,我们检查它的会话(根据其会话ID)是否已经在那里超过5个小时,如果是这种情况我们Abonden会议。(并当然从字典中删除id)
没有必要以这种方式拥有数千个计时器,我们不会立即使会话过期,但我们会等到下次用户向我们发送请求时。
答案 1 :(得分:0)
您是否尝试过web.config?
<configuration>
<system.web>
<sessionState
mode="InProc"
cookieless="true"
timeout="30" />
</system.web>
</configuration>
我还假设你有一个没有负载均衡或会话状态服务器的基本站点。那些需要不同的方法。
答案 2 :(得分:0)
如何设置Windows任务计划程序以运行一个aspx页面,该页面将检查用户登录的时间并根据它确定是否关闭会话。
(您可以在数据库中保存每个用户的登录时间)。