说实话,我试图在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);
Run Code Online (Sandbox Code Playgroud)
......这就是它的目的.*调用Application_Start*,(我已经检查了响应,它包含了应该在初始请求中显示的登录页面),并且应用程序池关闭应用程序通过在*Application_End*中执行必要的工作而正常结束.
但
在以这种方式启动(预加载和启动)应用程序之后,当我想通过Web浏览器访问应用程序时会发生这种情况:
HTTP错误500.21 - 内部服务器错误处理程序"ExtensionlessUrlHandler-Integrated-4.0"在其模块列表中有一个错误的模块"ManagedPipelineHandler"
我无法弄清楚这一点.谁能告诉我为什么会发生这种情况以及如何解决这个问题?
如果我不知道这一点,我将回到第一个解决方案(从代码发送GET请求),但这一问题将错误我,因为我甚至不有一个想法,什么是错的.