尽管已安装AspNetCoreModule,但在IIS中运行ASP.NET Core应用时仍然出现错误0x8007000d

时间:2019-03-04 14:04:23

标签: c# asp.net iis asp.net-core

我有一个ASP.NET Core应用程序,可以在IIS Express中很好地运行。同样,如果我通过dotnet run从命令行启动该应用程序,则一切都会顺利进行:

C:\Code\Sandbox\IisTestApp\IisTestApp>dotnet run
Using launch settings from C:\Code\Sandbox\IisTestApp\IisTestApp\Properties\launchSettings.json...
Hosting environment: Production
Content root path: C:\Code\Sandbox\IisTestApp\IisTestApp
Now listening on: http://localhost:5000
Now listening on: https://localhost:5001
Application started. Press Ctrl+C to shut down.

如果我尝试定位本地IIS,则会出现以下错误:

  

无法启动进程C:\ Program Files \ dotnet \ dotnet.exe。 Web服务器请求失败,状态码为500,内部服务器错误。完整的响应已写入C:\ Users {我的用户名} \ AppData \ Local \ Temp \ HttpFailure_08-05-50.html。

HTML文件包含以下信息:

Screenshot of 500.19 error

  

HTTP错误500.19-内部服务器错误

     

无法访问请求的页面,因为该页面的相关配置数据无效。

     

详细的错误信息:

     

模块 IIS Web核心
  通知 BeginRequest
  处理程序尚未确定
  错误代码 0x8007000d
  配置错误
  配置文件 \?\ C:\ Code \ Sandbox \ IisTestApp \ IisTestApp \ web.config
  请求的URL http://localhost:80/IisTestApp
  物理路径 C:\ Code \ Sandbox \ IisTestApp \ IisTestApp
  登录方式尚未确定
  登录用户尚未确定

注意:如果从该消息中看不出来,这是我问题的最小再现,而不是实际应用

我在网上看到的大多数内容都显示错误代码0x8007000d表示我没有.NET Core Windows Server Hosting组件(AspNetCoreModule),但我确实已经安装了该组件:< / p>

screenshot of add remove programs with hosting component installed

我还可以在IIS的“模块”主页面中看到它,并验证它指向的文件是否确实存在:

Screenshot of modules list in IIS

奇怪的是,如果我尝试转到该特定站点的“模块”页面,则会收到与网页相同的错误消息:

  

执行此操作时出错。

     

详细信息:

     

文件名:\?\ C:\ Code \ Sandbox \ IisTestApp \ IisTestApp \ web.config
  错误:

Screenshot of site modules error

此托管模块版本(2.1.8)通常与我安装的版本匹配:

C:\Users\{my user name}>dotnet --list-sdks
2.1.202 [C:\Program Files\dotnet\sdk]
2.1.504 [C:\Program Files\dotnet\sdk]

C:\Users\{my user name}>dotnet --list-runtimes
Microsoft.AspNetCore.All 2.1.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.All 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
Microsoft.AspNetCore.App 2.1.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
Microsoft.NETCore.App 2.1.8 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

测试应用程序的目标是什么

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All" />
  </ItemGroup>

</Project>

尽管如此,我认为问题确实与IIS和该托管组件有关!这是使用项目模板生成的(非常默认)web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="bin\IISSupport\VSIISExeLauncher.exe" arguments="-argFile IISExeLauncherArgs.txt" stdoutLogEnabled="false">
        <environmentVariables />
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

注意:如果我在processPath中硬编码完整路径,或者使用.\相对路径

,我仍然会收到相同的错误消息

如果我删除<aspNetCore>节点,则会收到另一个错误:

  

HTTP错误502.3-错误的网关

     

尝试路由请求时出现连接错误。

     

详细的错误信息:

     

模块 AspNetCoreModule
  通知 ExecuteRequestHandler
  处理程序 aspNetCore
  错误代码 0x80070490
  请求的URL http://localhost:80/IisTestApp
  物理路径 C:\ Code \ Sandbox \ IisTestApp \ IisTestApp
  登录方法匿名
  登录用户匿名

关键是AspNetCoreModule这次抛出错误,因此正在正在加载并运行一些代码。

发布到单独的文件夹并在IIS中手动设置站点(而不是依靠默认的Visual Studio行为来创建指向“ bin”文件夹的IIS网站)会导致相同的错误消息,尽管生成的web.config文件中的aspNetCore节点稍有不同:

<aspNetCore processPath="dotnet" arguments=".\IisTestApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout">
  <environmentVariables />
</aspNetCore>

是什么导致IIS无法运行此应用程序?

我尝试重新安装.NET Core(SDK,运行时和托管组件),但没有帮助。

我还注意到有几篇文章提到安装IIS的URL重写模块可纠正此错误(特别是:HTTP Error 500.19 - IIS 7.5 Error 0x8007000d)。我的web.config没有提到该模块,但是我尝试安装它,以防AspNetCoreModule在幕后使用它。这对我的情况没有帮助。

6 个答案:

答案 0 :(得分:8)

安装.NET Core主机捆绑包为我解决了该问题。 Here是指向.NET Core Hosting Bundle的链接。

使用.NET Core 3.1

答案 1 :(得分:3)

如果安装 .NET Core Windows主机捆绑包,但是 AspNetCoreModule 仍然没有出现在applicationHost.config上,则可以尝试执行以下操作在SO和其他地方尝试了所有其他解决方案之后,我确实解决了我的问题。

我在具有这些 AspNetCoreModule 行的另一台服务器中找到了applicationHost.config,并在损坏的服务器上更新了文件。 不确定为什么.NET Core安装未添加它们。

我在<globalModules>部分下添加了以下行:

<add name="AspNetCoreModule" image="%SystemRoot%\system32\inetsrv\aspnetcore.dll" />

还有<modules>下的这个:

<add name="AspNetCoreModule" />

希望这会有所帮助。

答案 2 :(得分:2)

排除了我(以及许多有用的评论者,尤其是Daboul)可能想到的所有特定于应用程序的内容,并查看了可见的IIS设置后,我求助于将IIS的主要配置文件视为整个:applicationHost.config

Introduction to ApplicationHost.config,此文件位于%windir%\system32\inetsrv\config中。由于实际应用程序在我办公室的另一台计算机上工作,因此我使用diff程序对它们进行了比较,发现我的配置文件中缺少以下节点:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <configSections>
        <!-- ...lots of other stuff... -->
        <sectionGroup name="system.webServer">
            <!-- ...lots of other stuff... -->

            <!--This "section" node for aspNetCore is the one that was missing-->
            <section name="aspNetCore" overrideModeDefault="Allow" />

添加一个节点即可解决该错误。

奇怪的是,文件中后来多次引用了AspNetCoreModule本身。由于我以前没有手动编辑过此文件,因此初次安装AspNetCoreModule时似乎出现了某种安装错误。

答案 3 :(得分:0)

我尝试使用以上建议,但没有成功。因此,我以管理员模式重新安装了Asp Net Core运行时托管,并且我的ApplicationHost.Config得到了纠正。

答案 4 :(得分:0)

安装.NET Core Hosting Bundle解决了该问题(如上答)

就我而言,解决方案很简单,只需还原Hosting bundle,它就可以解决问题。 还原之前,我得到了hresult 0x8007000d。在用于网络核心应用程序的iis中,未加载模块。

some image for more info

答案 5 :(得分:0)

我在 dotnet core 3.1 上也遇到此错误。

从 web.config 应用程序中删除包装器部分后开始工作:

enter image description here

改为:

<?xml version="1.0" encoding="UTF-8"?>
  <configuration>
     <system.webServer>
       <handlers>
          <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
       </handlers>
       <aspNetCore processPath="dotnet" arguments=".\ContactForm.Microservice.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
     </system.webServer>
  </configuration>