我有一个网站,它对某些资源拥有独占锁。我使用 .NET Application_Start 和 Application_End 事件在适当的时间获取和释放对这些资源的锁。为了使其正常工作,在任何给定时间只能运行一个我的应用程序实例。
为了实现这一点,我将Disable Overlapped Recycle
应用程序池的属性设置为True
。此属性旨在确保每次回收应用程序池时,旧的工作进程在新的工作进程启动之前完全关闭。无论何时通过 IIS 手动回收应用程序池,还是由于达到空闲超时而自动回收,或者根据任何特定时间/时间间隔规则自动回收,此方法都可以正常工作。
但是,当更新站点的 web.config 时,此规则不会应用 - 在旧工作进程完成关闭之前,新的工作进程启动了。这会导致不好的事情发生。我已将属性Disable Recycling for Configuration Changes
设置为False
,因为我确实希望在更新 web.config 时回收应用程序池 - 这在开发过程中经常发生。
这是预料之中的事情,还是 IIS 中的一个错误?我唯一的选择是设置更改 web.config 不会回收应用程序池吗?我宁愿不这样做,因为我很确定这会给人们带来很多麻烦,因为他们更改了配置,然后忘记回收应用程序池。
更新:
更清楚地说,当在start
旧工作进程关闭完成之前调用新的工作进程事件时,旧工作进程end
事件就永远不会被调用 - 它不会按顺序发生,根本不会发生。
答案1
来自此 MSDN 帖子: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/
因此,作为代码部署过程的一部分,当您部署以下任何一项更改时,您的池似乎将被回收:
立即回收
- Web.config 更改
- Machine.config 更改
- Global.asax 更改Global.asax changes
- Bin 目录变化
- App_Code 更改
(借自: https://stackoverflow.com/questions/302110/what-causes-an-application-pool-in-iis-to-recycle)