我需要知道,因为我必须明确关闭一些与用户会话相关的远程资源。
答案 0 :(得分:3)
我必须不同意达林。我在Session_End中调用一个函数来记录会话结束。我没有明确地对此进行过测试,但我查看了我的日志中最近几次应用程序池已回收。调用该函数并记录活动会话的结束。
当应用程序池按计划回收时,以及因为我部署了一些新dll而回收它时,都会发生这种情况。
答案 1 :(得分:1)
如果我没记错(自从我阅读文档以来已经有一段时间了)有活动会话将延迟正常的App池回收计时器(当资源应该被释放时触发),因为服务器在活动会话上存储意味着继续需要。一旦会话到期(并触发session_end事件),应用程序循环计时器将重新开始并倒计时,最终在线程池释放自己的资源并终止应用程序之前触发。
这是正常情况下,应该注意的是session_end事件不能保证会触发(这是非常具体的情况,它不会),我想现在这主要与IIS或App的崩溃实例有关游泳池回收OOM或错误。除非你只使用其中一种会话类型(我认为是状态服务器),否则它将无法可靠地触发。现在可能会有所不同。
如果您需要保证释放资源,我不确定session_end是否适合这样做。您是否可以将其提升到App Cache或HTTP Cache并使用会话唯一键和定期清理事件?这可能更可靠(更多代码)但更可靠。
我的一般经验是session_end相当可靠地触发,但我已经看到它在大量负载(每秒100次点击)下失败了,而且我知道当你开始讨论服务器场时它也变得非常复杂。
答案 2 :(得分:1)
另请注意,只有在使用Inproc会话模式时才会调用Session_End。对于其他模式(包括SQL会话状态模式),永远不会引发此事件。