老实说,我曾试图在 IIS 上使用一个肮脏的把戏,就在我以为我会逃脱它的时候,我意识到我的解决方法不起作用。这是我尝试做的事情:
1)我有一个 ASP.NET 应用程序,它具有继承IProcessHostPreloadClient的Preloader类,并在Preload方法实现中进行所有繁重的初始化(应用程序很复杂,它是一个巨大系统的一部分,所以它需要大约 2 分钟来建立所有必要的连接服务并预先实例化一些 Unity 注册)。
2) 我有很多工作需要在应用程序关闭时完成(取消订阅、断开连接、处理......),我想最好的地方是在Global.asax中的 *Application_End* 方法中。
3)当我有用户活动时,一切正常(启动包含上述Web应用程序的应用程序池后的第一个请求将导致调用*Application_Start*,然后在应用程序池停止或回收时调用*Application_End*),但是问题当没有用户活动并且应用程序在活动 48 小时后尝试自行重启时发生(配置要求)。由于没有任何请求,因此没有正式开始申请。因此,它不能优雅地停止,因为 *Application_End* 不会被调用。
4)现在是混乱的部分......我试图在Preload方法的末尾从代码发出 GET 请求,它起作用了。但是这个解决方案对我来说似乎很糟糕,即使它有效。所以,我尝试了很多东西,我尝试的最后一件事是:
SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);
......这已经达到了它的目的。*Application_Start* 被调用,(我检查了响应,它包含应该在初始请求中显示的登录页面)并且在应用程序池关闭时,应用程序通过在 *Application_End* 中完成必要的工作而优雅地结束。
但
以这种方式启动(预加载和启动)应用程序后,当我想通过 Web 浏览器访问应用程序时发生了这种情况:
HTTP 错误 500.21 - 内部服务器错误处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”
我无法弄清楚这一点。谁能告诉我为什么会发生这种情况以及如何解决?
如果我不明白这一点,我将回到第一个解决方案(从代码发送 GET 请求),但这个问题会让我感到困扰,因为我什至不知道出了什么问题。