269

老实说,我曾试图在 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 请求),但这个问题会让我感到困扰,因为我什至不知道出了什么问题。

4

22 回答 22

654

尝试使用aspnet_regiis -i. 它对我有用。

.NET 4 的可能路径(来自提升的命令提示符):

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

http://forums.iis.net/p/1190643/2026401.aspx

于 2012-11-07T09:29:46.517 回答
184

如果您在使用 Windows 8/Windows Server 2012 和 .Net 4.5 时遇到此错误,请按照以下说明操作: http ://www.britishdeveloper.co.uk/2013/01/handler-extensionlessurlhandler.html

转到“打开或关闭 Windows 功能” 然后 Internet 信息服务然后万维网服务然后应用程序开发功能然后启用 ASP.NET 4.5

这对我有用(尽管 Windows Server 2012 中的向导和措辞略有不同,但您会明白的)。话虽如此,为什么在通过 Web 平台安装程序安装所有内容(包括所有依赖项)之后有必要这样做是完全超出了我的范围......

于 2013-02-26T22:54:21.857 回答
68

尽管遵循了此页面上的大部分建议,但我仍然在 Windows Server 2012 上遇到问题。安装 .NET Extensibility 4.5 为我解决了这个问题:

Add Roles and Features > Server Roles > Web Server (IIS) > Web Server > Application Development > .NET Extensibility 4.5

于 2013-07-31T11:43:53.913 回答
58

对于Windows 10 / Windows Server 2016,使用以下命令:

dism /online /enable-feature /featurename:IIS-ASPNET45 /all

建议的答案aspnet_regiis不适用于 Windows 10(Creators Update 及更高版本)或 Windows Server 2016:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
Microsoft (R) ASP.NET RegIIS 4.0.30319.0
管理实用程序,用于在本地计算机上安装和卸载 ASP.NET。
版权所有 (C) 微软公司。版权所有。
开始安装 ASP.NET (4.0.30319.0)。
此版本的操作系统不支持此选项。管理员应该使用“打开/关闭 Windows 功能”对话框、服务器管理器管理工具或 dism.exe 命令行工具来安装/卸载带有 IIS8 的 ASP.NET 4.5。 有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=216771
完成安装 ASP.NET (4.0.30319.0)。

有趣的是,“打开/关闭 Windows 功能”对话框不允许我取消勾选 .NET 或 ASP.NET 4.6,只有上面的 DISM 命令有效。不确定功能名称是否正确,但它对我有用。

于 2017-01-05T05:57:20.843 回答
42

运行以下命令之一:

对于 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
于 2014-07-31T15:40:19.137 回答
26

这个https://stackoverflow.com/a/13266763/1277458完美运行。但是,如果您有 64 位操作系统,请在路径中使用 Framework64 而不是 Framework:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i
于 2014-06-23T11:05:49.830 回答
25

问题

您在不是为它设计的场景中使用SimpleWorkerRequest。您在 IIS 内部使用它。如果您查看之前的 MSDN 链接(重点是我的):

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

此外,如果您查看System.Web.Hosting 命名空间SimpleWorkerRequest在此命名空间中)的 MSDN 文档,您还将看到与上述类似的内容(再次强调的是我的):

System.Web.Hosting 命名空间提供了从Microsoft Internet 信息服务 (IIS) 之外的托管应用程序托管 ASP.NET 应用程序的功能。

解决方案

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

那么微软解决方案究竟是做什么的呢?它会做你想做的事——在应用程序池启动后,IIS 会向你的网站发送一个“get”请求。

于 2013-11-26T21:35:59.167 回答
13

在我的情况下(Windows 10 + IIS 10),我必须打开“打开或关闭 Windows 功能”,然后转到 Internet 信息服务 > 万维网服务 > 应用程序开发功能 > 并检查ASP.NET 4.6

于 2016-01-09T21:35:35.207 回答
7

我解决了这个问题,在“打开或关闭 Windows 功能”选项中添加了 ASP.NET 4.7

在此处输入图像描述

于 2018-02-22T01:09:37.313 回答
6

将其作为自己的帖子,因为这让我花了好几个小时。

我在这里和其他地方看到了十几个关于这个问题和 aspnet_regiis 修复的类似帖子。他们不为我工作,而且 aspnet_regiis 表现得很奇怪,只是列出选项等。

正如上面的用户 ryan-anderson 所示,您无法输入 .exe

对于那些对服务器上 IIS 之外的东西不太满意的人,您可以通过简单的步骤执行以下操作。

  1. 在与此路径类似的文件夹中找到 aspnet_regiis。c:\Windows\Microsoft.NET\Framework\v4.0.30319\

  2. 在开始菜单或任何地方右键单击命令提示符并告诉它以管理员身份运行。使用 Windows 的“运行”功能是行不通的,或者不适合我。

  3. 返回到 aspnet_regiis 可执行文件。单击并将其拖动到命令提示符中,或将地址复制粘贴到命令提示符中。

  4. 删除,如果它在那里,最后的 .exe。这是关键。在末尾添加 -i(空格减去眼睛)。进入。

如果您正确执行此操作,您将看到它开始安装 asp.net,然后告诉您安装成功。

于 2017-03-10T15:17:33.940 回答
5

确保您已在IIS 管理器application-site中将您的版本设置v2.0为:v4.0

应用程序池 > 您的应用程序 > 高级设置 > .NET Framework 版本

之后,安装您的ASP.NET.

对于 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 管理器中重新启动application-site并享受。

于 2016-10-31T12:25:51.267 回答
4

我知道这是一个老歌,但我想我可能会增加一些价值。对于我们这些在域外运行服务器核心的人(域成员可以远程运行服务器管理器来添加/删除功能/角色),您必须求助于命令行。

Powershell 用户可以输入“Install-WindowsFeature Web-Asp-Net45”

这应该相当于使用服务器管理器。

于 2013-08-19T09:43:36.370 回答
4

安装了 .net 4.7 时,我遇到了同样的错误消息。

解决方案是按照前面提到的一篇文章使用“打开或关闭 Windows 功能”,其中“.NET Framework 4.7 高级服务”->“ASP.NET 4.7”已经被选中。

在列表的下方,还有“Internet 信息服务”和子注释“应用程序开发功能”->“ASP.NET 4.7”,这也需要检查。

启用此功能时,会启用其他功能...我只需按下确定按钮,问题就解决了。 Windows 功能对话框的屏幕转储

于 2017-12-14T15:10:48.643 回答
2

我正在使用 Windows Server 2012。.NET 可扩展性 4.5 功能已启用。WebDAVM 模块已移除。我仍然在 ASP.NET 路由“/docs”上收到 500.21 错误。

将“skipManagedModules”更改为 false 可以解决问题。

<applicationInitialization doAppInitAfterRestart="true" skipManagedModules="false">
        <add initializationPage="/docs" />    
</applicationInitialization>

感谢https://groups.google.com/forum/#!topic/bonobo-git-server/GbdMXdDO4tI

于 2015-11-20T09:42:35.717 回答
2

安装 .NET 4.7 对我有用。我之前只安装了 3.5。在此处输入图像描述

于 2020-02-19T19:37:31.493 回答
1

我遇到了这个问题,发现删除以下文件夹有帮助,即使是非 Express edition.Express:

C:\Users\<user>\Documents\IISExpress

于 2013-02-15T12:13:31.977 回答
1

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

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

于 2015-03-30T20:33:36.893 回答
0

503 Service Unavailable对我来说,从我的服务器中删除 WebDAV 会导致应用程序在使用PUTor时返回错误消息DELETE,因此我再次重新安装了它。我还尝试完全删除 .NET Framework 4.5 并重新安装它,还尝试按照建议重新注册,但无济于事。

我可以通过为单个应用程序池禁用 WebDAV 来解决此问题,这在使用PUTor时停止了“坏模块”错误DELETE

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

  1. 单击受影响的应用程序池
  2. WebDAV Authoring Tools在列表中查找
  3. 点击打开
  4. 点击Disable WebDAV右上角的。

呸呸呸!

我仍然将删除项目留在我的web.config文件中。

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

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

于 2015-02-18T10:39:28.977 回答
0

您可以通过将 iis 中的“ExtensionlessUrlHandler-Integrated-4.0”类型更改为 System.Web.DefaultHttpHandler 来修复它

于 2014-05-21T15:53:50.407 回答
0

这对于 OP 来说可能不是一个有用的解决方案,但它涉及相同的“错误”消息。

我们在 IIS8.5 上托管 PHP 页面,并正确安装了 .NET 4.5。

我们利用预加载功能来确保我们的应用程序始终全面响应。

一段时间后,我们开始随机收到此错误。

在 web.config 中:我将 skipManagedModules 设置为 true,-> 不要这样做!

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
<applicationInitialization skipManagedModules="false" doAppInitAfterRestart="true">
  <add initializationPage="/" />
</applicationInitialization>
...

虽然网站是php,但到分页的路由是由模块管理的!!!

于 2015-05-26T14:54:49.313 回答
0

我也遇到了这个问题。我的 MVC4 应用程序在带有 IIS 8.5 的 Windows Server 2012 R2 上运行。这些发布的解决方案都不适合我...通过 IIS 功能安装缺少的框架可以解决它,但安装总是失败。

我不得不使用Web Platform Installer并安装了以下软件包:

在此处输入图像描述

于 2016-01-07T12:00:09.667 回答
0

我在托管在共享托管服务器上的 Web 应用程序中遇到了这个问题。所以显然没有直接访问 IIS,所以不能应用这里提出的许多解决方案。

在托管服务提供商的控制面板上,我为 IIS 和 ASP.Net 启用了错误日志记录。然后才知道错误实际上在于缺少 cshtml。

于 2017-03-05T14:19:45.857 回答