我有一个网站,它拥有对某些资源的独占锁定.我使用.NET Application_Start和Application_End事件在适当的时间获取并释放对这些资源的锁定.为了使其正常工作,我的应用程序只能在任何给定时间运行一个实例.
为了实现这一点,我将Application Pool上的Disable Overlapped Recycle属性设置为True.此属性应确保在应用程序池被回收时,旧工作进程在新应用程序启动之前完全关闭.无论何时通过IIS手动回收应用程序池,这都可以正常工作,因为达到了空闲超时,或者根据任何特定的时间/时间间隔规则自动回收.
但是,当更新站点的web.config时,不会应用此规则 – 新旧的工作进程在旧的完成关闭之前启动.这会导致糟糕的事情发生.我将禁用回收配置更改属性设置为False,因为我希望在更新web.config时回收应用程序池 – 这在开发期间经常发生.
这是预期的,还是IIS中的错误?是我唯一的设置选项,以便更改web.config不回收应用程序池?我宁愿不这样做,因为我很确定这会让人们更改配置然后忘记回收应用程序池会引起很多麻烦.
更新:
更清楚的是,当在旧的工作进程完成关闭之前调用新的工作进程启动事件时,旧的工作进程结束事件永远不会被调用 – 它不会不按顺序发生,它根本不会发生.
来自这篇MSDN帖子:
https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/
原文链接:https://www.f2er.com/windows/370812.htmlhttps://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/
因此,作为代码部署过程的一部分,当您部署以下任何一个更改时,您的池似乎会回收:
立即回收
> Web.config更改
> Machine.config更改
> Global.asax更改
> Bin目录更改
> App_Code更改
(借鉴自:https://stackoverflow.com/questions/302110/what-causes-an-application-pool-in-iis-to-recycle)