老实说,我试过对IIS耍卑鄙的花招,就在我以为我能逃脱的时候,我意识到我的解决办法不起作用。以下是我试图做的:

1)我有ASP。NET应用程序,它拥有继承IProcessHostPreloadClient的Preloader类,并在Preload方法实现中进行所有繁重的初始化(应用程序很复杂,它是一个巨大系统的一部分,所以它需要大约2分钟来建立到所有必要服务的连接并预实例化一些Unity注册)。

2)我有很多工作需要做的应用程序关闭(取消订阅,断开连接,处理,…),我猜最好的地方是在*Application_End*方法位于Global.asax。

3) Everything works just fine when I have user activity (first request after the Application Pool that contains aforementioned web application is started will cause *Application_Start* to be called and afterwards *Application_End* is called on Application Pool stop or recycle), but problems occur when there is no user activity and application tries to restart itself after being active for 48 hours (configured requirement). Since there was no requests, application officially didn't get started. Ergo, it can't be gracefully stopped since *Application_End* won't be called.

4)现在轮到麻烦的部分了……我尝试在Preload方法的末尾从代码中发出GET请求,它工作了。但这个解决方案对我来说很糟糕,尽管它很有效。所以,我尝试了很多东西,我最后尝试的是:

SimpleWorkerRequest swr = new SimpleWorkerRequest(string.Empty, string.Empty, tw);
HttpRuntime.ProcessRequest(swr);

... 这已经达到了它的目的。*Application_Start*被调用,(我检查了响应,它包含登录页面,应该在初始请求中显示)和应用程序池关闭应用程序通过在*Application_End*中做必要的工作优雅地结束。

BUT

应用程序以这种方式启动(预加载和初始化)后,当我想通过Web浏览器访问应用程序时,会发生以下情况:

HTTP错误500.21 -内部服务器错误 “ExtensionlessUrlHandler-Integrated-4.0”在它的模块列表中有一个坏模块“ManagedPipelineHandler”

我想不通。有人能告诉我为什么会发生这种情况以及如何解决吗?

如果我不明白这一点,我将回到第一个解决方案(从代码发送GET请求),但这个问题会困扰我,因为我甚至不知道哪里出了问题。


当前回答

如果你在Windows 8/Windows Server 2012和。net 4.5上遇到这个错误,请遵循以下说明: http://www.britishdeveloper.co.uk/2013/01/handler-extensionlessurlhandler.html

点击“打开或关闭Windows功能” 互联网信息服务 然后是万维网服务 然后是应用程序开发特性 然后启用ASP。NET 4.5

这对我来说很管用(尽管Windows Server 2012中的向导和措辞略有不同,但你会发现的)。话虽如此,为什么在通过Web平台安装程序(包括所有依赖项)安装了所有东西之后,这是必要的,这完全超出了我的范围……

其他回答

对我来说,从服务器上删除WebDAV会导致应用程序在使用PUT或DELETE时返回503服务不可用错误消息,所以我重新安装了它。我还尝试完全删除。net Framework 4.5并重新安装它,并尝试按照建议重新注册,但没有效果。

我能够通过禁用个人应用程序池的WebDAV来修复这个问题,这在使用PUT或DELETE时阻止了“坏模块”错误。

禁用单个应用程序池的WebDAV:

单击受影响的应用程序池 在列表中找到WebDAV创作工具 点击打开 单击右上角的“禁用WebDAV”。

我们daaaa !

我仍然在我的网中留下了删除项。配置文件。

 <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
    </handlers>
 <system.webServer>

这个链接是我找到说明的地方,但不是很清楚。

这个问题

您正在一个并非为其设计的场景中使用SimpleWorkerRequest。您正在IIS中使用它。如果你看看之前的MSDN链接(重点是我的):

提供HttpWorkerRequest抽象类的简单实现,可以用来托管ASP。Internet信息服务(IIS)应用程序之外的NET应用程序。您可以直接使用SimpleWorkerRequest或扩展它。

同样,如果你查看System.Web.Hosting名称空间的MSDN文档(SimpleWorkerRequest在这个名称空间中),你也会看到类似于上面的东西(再次强调,是我的):

hosting命名空间提供了托管ASP的功能。从Microsoft Internet信息服务(IIS)外部的托管应用程序转移到NET应用程序。

解决方案

我建议删除对SimpleWorkerRequest的调用。相反,你可以使用微软的解决方案来确保你的网站在回收后自动启动。您需要的是IIS 7.5的Microsoft应用程序初始化模块。配置起来并不复杂,但是您需要了解具体的选项。这就是为什么我也会推荐iis7.5的应用程序初始化UI。用户界面是由MSDN博主编写的。

那么微软的解决方案到底能做什么呢?它做了你正在尝试做的事情——IIS在应用程序池启动后向你的网站发送一个“get”请求。

这个错误从上周开始发生在我身上,影响了我机器上现有的网站。我尝试了这里的任何建议都没有运气。最终,我从IIS中完全删除了WebDAV (Windows功能->互联网信息服务->万维网服务->通用HTTP功能-> WebDAV发布)。在此之后,我重新设置了IIS,我的错误最终得到了解决。

我只能猜测是Windows更新引起了这个问题,但我不能确定。

运行以下命令:

32位Windows操作系统:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

64位Windows操作系统:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -I

确保在IIS管理器中将应用程序站点版本从v2.0设置为v4.0:

应用程序池>您的应用程序>高级设置>。net框架版本

之后,安装ASP.NET。

32位操作系统(Windows):

C:\Windows\ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_regiis.exe -我

64位操作系统(Windows):

C:\Windows\ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet_regiis.exe - i

在IIS管理器中重新启动您的应用程序站点,并享受它。