IIS无法运行ASP.NET Core网站 - HTTP错误502.5

71
我们有一台Windows 2012 R2的机器。在该机器上,我部署了一个现有的ASP.NET Core网站,已经运行良好。

然而,今天再次发布到该网站时,距离上一次修改已经有一个月了,我无法访问该网站,浏览器显示如下错误:

HTTP Error 502.5 - Process Failure

更多信息请访问:http://go.microsoft.com/fwlink/?LinkID=808681

如果我登录服务器并单击已部署目录中的exe文件,它会打开命令提示符并显示我的站点于5000端口。如果我在http://localhost:5000上访问该站点,则运行正常,因此问题与IIS有关,而不是与站点本身有关。

如果我登录服务器,可以在Windows事件查看器中看到以下内容

enter image description here

“应用程序'MACHINE/WEBROOT/APPHOST/DEFAULT WEB SITE/MySite'的物理根目录为'D:\Sites\MySite\',但启动命令行为'\"%LAUNCHER_PATH%\" %LAUNCHER_ARGS%'的进程启动失败,错误代码为'0x80070002 : 0。

当我在浏览器中访问链接时,显示需要重新安装 .net Core Hosting bundle。我已经重新安装了,但浏览器中的错误消息仍然相同。”

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore requestTimeout="02:00:00" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
  </system.webServer>
</configuration>

当我查看我的应用程序日志文件夹时,每次尝试访问该站点时都会创建一个stdout文件,但每次大小都为0KB且内容为空。

为什么IIS突然拒绝工作,而之前它是可以工作的,但如果我直接访问编译后的exe,则该应用程序可以工作?


那个 web.config 的更改没有生效。答案中发布的那个可以。 - dev2go
2
信不信由你:在我的情况下,这发生是因为我用空格命名了项目。 - Marco Alves
我的502.5是由于Program.cs中的NullReferenceException引起的--我通过从命令行启动应用程序来找到了这行代码-> https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/troubleshoot?view=aspnetcore-2.0#application-event-log - IEnjoyEatingVegetables
<AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName> 更改为 AspNetCoreModuleV2,然后它将读取 processPath="%LAUNCHER_PATH%" - Pierre
21个回答

63

你的问题是一个不良的web.config文件:

<aspNetCore requestTimeout="02:00:00" 
     processPath="%LAUNCHER_PATH%" 
     arguments="%LAUNCHER_ARGS%" 
     stdoutLogEnabled="true" 
     stdoutLogFile=".\logs\stdout" 
     forwardWindowsAuthToken="false" />

%LAUNCHER_PATH%路径在您的系统上不存在,甚至不是有效的路径。它应该类似于:

<aspNetCore requestTimeout="02:00:00" 
     processPath=".\yourAppName.exe" 
     arguments="somePossibleArgument" 
     stdoutLogEnabled="true" 
     stdoutLogFile=".\logs\stdout" 
     forwardWindowsAuthToken="false" />

请注意,如果应用程序从命令行启动,则web.config文件将被完全忽略,这就是为什么您不会收到错误信息的原因。


1
工作了。我不知道为什么旧的web.config在一个月前还能正常工作,现在却突然停止工作了。 - dev2go
@dev2go 很高兴它起作用了,我几天前也遇到了同样的问题。 - Camilo Terevinto
1
Visual Studio 也会在 Visual Studio 的 "%LAUNCHER_PATH%" 中重置你的 web.config 吗? - dev2go
1
我修改了我的web.config路径,但它自动更改为processPath="% LAUNCHER_PATH%"。 - Auguste
我试了三天来修复这个错误!你帮我解决了它。非常感谢你!<3 - R.S
显示剩余2条评论

54
我遇到了相同的问题,我的问题是IIS无法获取到.NET的路径。通过指定dotnet.exe的路径,我解决了这个问题。
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="C:\Program Files\dotnet\dotnet.exe" arguments=".\your-project.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"/>
  </system.webServer>
</configuration>

3
我有同样的问题。不过奇怪的是,因为"c:\Program Files\dotnet"部分明显在环境变量路径中,所以本应该从那里获取它。我猜测需要重新启动计算机,如果真是这种情况,稍后会回报。 - MajorRefactoring
1
@MajorRefactoring,你需要重新启动服务器吗?我遇到了同样的问题,重启了IIS以查看是否会接受PATH更改,但没有任何变化。我怀疑也需要重新启动,但不能在生产服务器上自由地执行此操作。 - Engin
4
在我的情况下,打开应用程序池设置中的负载配置文件起作用了。由于某种原因它被设置为 false,这似乎不是默认设置。 - Engin
1
如果您在32位Asp.Net Core应用程序中遇到此问题,请尝试此相关答案 - Nathan
3
我有同样的症状 - 但只是因为我没有读安装程序,当它提示重新安装后记得重新启动IIS。运行iisreset解决了这个问题。 - m3z
1
太好了!我遇到了同样的问题,我通过设置 dotnet 的完整路径来解决错误,像这样:processPath="C:\Program Files\dotnet\dotnet.exe"。 - A.Dara

15

我的问题是由于在 appsettings.json 文件中存在无效的转义序列,导致进程无法启动。

我正在使用dotnet来运行发布的ASPNET Core 2 Web API DLL。通过打开命令提示符并导航到网站文件所在的目录,问题得以揭示。一旦到达那里,我运行了以下命令:

dotnet mySite.dll

(将mySite.dll更改为您应用程序的主dll。另外,请确保已经安装了.NET Core Windows Server Hosting Bundle的正确版本)。

按下回车键,它立即崩溃,并在控制台窗口中提供了确切的反馈,说明出了什么问题。如果您遇到类似的麻烦,这是帮助确定启动错误的好方法。


2
我曾经遇到过类似的问题,这个命令帮助我找到了问题所在。 - Sushil Kumar

7
问题:当我部署 asp net core web API 时,processPath 被设置为 dotnet。应用程序无法启动,事件查看器显示上述错误。
解决方案:
应该设置应用程序池标识以加载配置文件。
导航到:应用程序池 -> NetCore(您的池)->高级设置->加载用户配置文件->将其设置为 true 我验证了将其设置为 false 会重新创建错误,而将其设置回 true 则解决了问题。

1
谢谢 @A P,我今天又遇到了这个错误,这正是我的问题,非常感谢您 :-) - Mostafa Fallah

5
我遇到了类似的问题。我按照以下故障排除步骤:检查系统事件日志以查找错误消息,并从事件查看器中找到了以下内容:应用程序“MACHINE/WEBROOT/APPHOST/[MyFolder]”,物理根目录为“C:\inetpub\wwwroot\[MyFolder]\”,无法启动带有命令行“dotnet .\MyApp.dll”的进程,错误代码为“0x80004005: 80008083”。 然后我从终端重新运行了dotnet .\MyApp.dll,得到了答案:
It was not possible to find any compatible framework version
The specified framework 'Microsoft.AspNetCore.App', version '2.1.1' was not found.
  - Check application dependencies and target a framework version installed at:
      \
  - Alternatively, install the framework version '2.1.1'.

所以,原因与jv_回答的相同,你没有安装兼容的框架版本。我最终使用了“自包含”部署模式,它起作用了。


谢谢。正是我遇到的问题。安装所需的.NET Core和ASP.NET Core运行时版本,问题就解决了。 - tala9999
1
这不是完全适合我的解决方案,但你告诉了我一种非常重要的调试方式,通过从命令提示符中运行 dotnet。这就是我找到原因的方法!谢谢! - Leonard AB

3
对我来说,问题在于我的项目名称中有一个空格:App WebAPI.dll。因此,当执行"dotnet .\App WebAPI.dll"时,它会失败,因为实际上是在尝试执行"dotnet .\App",并忽略了空格后面的部分。
将我的解决方案和项目名称重命名以去除空格(AppWebAPI)解决了我的问题。

这就是解决方案。我只是重命名了程序集名称,然后它就起作用了。在VS2019中,右键单击项目,然后选择属性,应用程序选项卡将有一个文本框来更改程序集名称。真是太痛苦了。 - Ives.me

2

我曾遇到与Visual Studio相同的问题,即在转换web.config文件并更改processPath和arguments时。如Microsoft网站所述,您可以在project.csproj文件中添加排除项:

<PropertyGroup>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

这已经解决了我在发布时路径值改变的问题,但在使用Visual Studio进行调试时,仍然存在它自行更改的问题。

2
这对我不起作用。在构建项目时,web.config正在被重写为processPath="% LAUNCHER_PATH%"和arguments="% LAUNCHER_ARGS%"。 - harlam357

2
当我部署应用程序时,遇到了同样的问题。这是由于我的一些问题导致的 :)
我仔细阅读了这个页面:ASP.NET Core: Publishing to IIS 首先,我没有安装.NET Core Windows Server Hosting bundle的所有部分。最后,我进行了一个面向框架的部署而不是自包含的部署。我们有很多应用程序,并且不希望/需要它们各自拥有 .net core 的版本。在服务器上会有太多版本的 .net。
此外,请注意,如果您的管理员对服务器执行了任何更新/升级操作,则可能会破坏您的ASP.NET Core安装(请参见ASP.NET Core: Publishing to IIS故障排除部分)。
然后,我不得不修复我的web.config……这是我正在使用的已发布的web.config: 我没有发布为*.exe,而是使用了*.dll(请注意我的arguments值)。另外,我的processPath设置为“dotnet”。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\DT.Web.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
  </system.webServer>
</configuration>

此外,请确保您的 project.json 选项都与服务器环境兼容(参见 ASP.NET Core:发布到 IIS 故障排除部分)。
如果有帮助,这是我的 project.json 的副本:
{
  "version": "2.0.1.0",

  "dependencies": {
    "DT.Common": "2.*",
    "DT.Configuration": "2.*",
    "DT.Services": "2.*",
    "DT.Web.ViewModels": "2.*",
    "Microsoft.ApplicationInsights.AspNetCore": "1.0.2",
    "Microsoft.AspNetCore.Authentication": "1.1.0",
    "Microsoft.AspNetCore.Authentication.Cookies": "1.1.0",
    "Microsoft.AspNetCore.Authentication.OpenIdConnect": "1.1.0",
    "Microsoft.AspNetCore.Diagnostics": "1.1.0",
    "Microsoft.AspNetCore.Mvc": "1.1.0",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.1.0-preview4-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.1.0-preview4-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.AspNetCore.Server.Kestrel.Https": "1.1.0",
    "Microsoft.AspNetCore.Session": "1.0.0",
    "Microsoft.AspNetCore.StaticFiles": "1.1.0",
    "Microsoft.Extensions.Caching.SqlServer": "1.0.0",
    "Microsoft.Extensions.Configuration.Abstractions": "1.1.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
    "Microsoft.Extensions.Configuration.Json": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.Extensions.Logging.Debug": "1.1.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.Graph": "1.1.1",
    "Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.6"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.1.0-preview4-final",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.1.0-preview4-final",
      "imports": "portable-net45+win8+dotnet5.6"
    },
    "Microsoft.Extensions.Caching.SqlConfig.Tools": "1.1.0-preview4-final"
  },

  "frameworks": {
    "netcoreapp1.1": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ],
      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.1.0",
          "type": "platform"
        }
      }
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "views/**/*.cshtml",
      "appsettings.json",
      "appsettings.*.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "bower install", "gulp buildprod" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

救了我的一天!谢谢。我不知道为什么一切都可以使用 <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />,然后突然停止了。手动指定参数的程序集和进程路径为dotnet让它工作了 ;) - Ivaylo

0

你试图开发一个没有安装.NET Core SDK的.NET Core应用程序? - TylerH

0
当我所在的团队遇到这个问题时,有人只是用Visual Studio构建了项目并压缩了bin文件夹。
你需要运行dotnet publish命令,以便msbuild任务可以正确地构建您的web.config文件。它应该替换%LAUNCHER_PATH%和%LAUNCHER_ARGS%变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接