检测 ASP.NET 应用程序在长时间运行的请求期间何时关闭

Chr*_*dge 5 asp.net iis-7.5

关于如何使用IRegisteredObject检测应用程序何时关闭存在一些问题。但是,在所有活动请求完成之前,不会调用 IRegisteredObject.Stop。

长时间运行的请求(pushlet、长轮询、Web 套接字)就是这种情况,这意味着应用程序池回收可能会被这些请求无限期地拖延。

有没有办法从长时间运行的请求中检测到应用程序关闭正在挂起?

我已经使用 IRegisteredObject 或轮询 HostingEnvironment.ShutdownReason 进行了测试。在活动请求完成之前,两者都不起作用。

Chr*_*dge 4

Katana/Owin 项目访问内部 System.Web.Hosting.UnsafeIISMethods.MgdHasConfigChanged 方法来检测关闭,以便长时间运行的请求可以检测到此状态。

有关示例实现,请参阅ShutdownDetectorUnsafeIISMethods 。

  • 如果您使用 .NET 4.5.1,您将需要锁定 HostingEnvironment.StopListening 事件。Katana 已更新 ShutdownDetector 以执行同样的操作 - https://github.com/projectkudu/kudu/commit/3fd87282cf041cc10970463707b4cdae62e4c0b3 (2认同)