老实说,我试过对IIS耍卑鄙的花招,就在我以为我能逃脱的时候,我意识到我的解决办法不起作用。以下是我试图做的:
1)我有ASP。NET应用程序,它具有继承IProcessHostPreloadClient的预紧器类,并在预加载方法实现中进行所有繁重的初始化(应用程序很复杂,它是一个庞大系统的一部分,所以它需要大约2分钟来建立到所有必要服务的连接并预实例化一些Unity注册)。
2)我有很多工作需要做的应用程序关闭(取消订阅,断开连接,处置,…),我猜最好的地方是在*Application_End*方法位于Global.asax。
3)当我有用户活动时一切都很好(包含上述web应用程序的应用程序池启动后的第一个请求将导致*Application_Start*被调用,然后*Application_End*在应用程序池停止或回收时被调用),但当没有用户活动时,应用程序试图在活跃48小时后重新启动自己时会出现问题(配置要求)。因为没有请求,所以没有正式开始申请。因此,它不能优雅地停止,因为*Application_End*不会被调用。
4)现在轮到麻烦的部分了……我已经尝试在预加载方法的末尾从代码中发出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请求),但这个问题会困扰我,因为我甚至不知道哪里出了问题。