我试图检测 ASP.NET 应用程序何时由于 web.config 文件被修改或 IIS 应用程序池被手动回收而被回收。
最初我认为 ASP.NET 的 Application_End 方法会起作用,并尝试了以下方法:
protected void Application_End(object sender, EventArgs e)
{
File.AppendAllText("log.txt", DateTime.Now + "\n");
}
该文件是在第一次更改 web.config 文件时创建的,但后续更改不会触发该事件。同样,在 IIS 中进行测试时,第一个手动应用程序池回收创建了文件,但后来的没有创建文件 - 就好像 Application_End 事件只触发一次。
我如何检测池/应用程序每次回收?
最佳答案
以下内容可能有点乱,但您可以使用应用程序 Cache
来解决它。每次加载页面时,您都可以检查缓存中的特定键,如果该键不存在,那么您可以将其视为“回收”,然后添加该键。不是最好的方法,但可能正好满足您的需要。
例如。在您的基本页面的 Page_Load
或将随每个请求一起运行的某个地方,您可以执行以下操作:
if (HttpContext.Current.Cache["RecycleCheck"] != null)
{
// Add flag to cache
HttpContext.Current.Cache.Insert("RecycleCheck", "1", null,
DateTime.UtcNow.AddDays(2), // 2 days (most will recycle by then)
System.Web.Caching.Cache.NoSlidingExpiration);
// Do what you need because a recycle has happened
}
此方法不会在回收发生时将其拾取。它只会在回收后的第一个请求上识别回收。
Application_Start
将是最可靠的执行此操作的地方,但它遇到与 hack 相同的问题,因为它发生在第一次请求的回收之后。
关于c# - 检测 ASP.NET 应用程序何时回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7271733/