.NET Core 发布到 IIS - HTTP 错误 502.3 - 错误的网关 - 指定的 CGI 应用程序遇到错误,服务器终止了进程

.NET Core publish to IIS - HTTP Error 502.3 - Bad Gateway - The specified CGI application encountered an error and the server terminated the process

我正在尝试向 IIS 发布 .NET Core ASP.NET 我从 RC2 升级到 RTM 的网站。

作为完整性检查,我从 Visual Studio 2015 年成功发布了 template/sample "ASP.NET Core Web Application (.NET Framework)" 应用程序。

但出于某种原因,在发布 RTM 升级后的应用程序时,我收到 HTTP 错误 502.3 - 网关错误 指定的 CGI 应用程序遇到错误,服务器终止了进程。

该站点确实有效 运行 来自 Visual Studio 的 IIS Express。

我该如何调试它?有人有什么想法吗?

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>

<system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath=".\MyApp.exe" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
  </system.webServer>
</configuration>

project.json

{
  "buildOptions": {
  "emitEntryPoint": true,
  "preserveCompilationContext": true,
  "warningsAsErrors": true
},
"dependencies": {
  "Microsoft.AspNetCore.Diagnostics.Elm": "0.1.0",
  "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0",
  "Microsoft.AspNetCore.Authorization": "1.0.0",
  "Microsoft.AspNetCore.Diagnostics": "1.0.0",
  "Microsoft.AspNetCore.Hosting": "1.0.0",
  "Microsoft.AspNetCore.Hosting.Abstractions": "1.0.0",
  "Microsoft.AspNetCore.Http.Extensions": "1.0.0",
  "Microsoft.AspNetCore.Localization": "1.0.0",
  "Microsoft.AspNetCore.Mvc": "1.0.0",
  "Microsoft.AspNetCore.Routing": "1.0.0",
  "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
  "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
  "Microsoft.AspNetCore.Session": "1.0.0",
  "Microsoft.AspNetCore.StaticFiles": "1.0.0",
  "Microsoft.Extensions.Caching.SqlServer": "1.0.0",
  "Microsoft.Extensions.Logging.Console": "1.0.0",
  "Microsoft.Extensions.Logging.Debug": "1.0.0",
  "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",

  "Microsoft.AspNetCore.Razor.Tools": {
    "version": "1.0.0-preview2-final",
    "type": "build"
  },

  "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
  "Microsoft.Extensions.Configuration.Json": "1.0.0",
  "Microsoft.Extensions.Logging": "1.0.0",
  "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0"
},

"frameworks": {
   "net461": {}
 },

"tools": {
  "BundlerMinifier.Core": "2.0.238",
  "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
  "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},

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

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

How can I debug this? Anyone have any ideas?

这里有三个想法:

  1. Read this 并确保您已经涵盖了它所说的所有内容。

  2. 运行 从命令行发布 .\MyApp.exe。那样有用吗?

    • 如果是,则说明您遇到了 IIS 集成问题。
    • 如果没有,则表明您遇到了应用程序问题。
  3. stdoutLogEnabled="false" 更改为 true,然后检查 stdoutLogFile=".\logs\stdout" 处的日志。那里的错误可能会告诉你一些事情。

  4. 在事件查看器中检查您的 IIS 应用程序日志。那里的错误可能会告诉你一些事情。

事件查看器应用程序日志

解决方案对我不起作用,但有效的是:

启用 Web 开发人员模式(在浏览器中按 F12)=> 应用程序选项卡 => 然后 删除所有 cookie。 刷新页面,瞧:它起作用了。 您也可以复制 URL 并粘贴到您没有 运行 任何 MVC 项目的另一个浏览器。

我的项目无需任何更改即可在 Internet Explorer 和 Microsoft Edge 上运行。 也许这就是您出错的原因。

如果您 运行 一个任务很长时间,并且网络浏览器在 2 分钟(默认请求时间)内没有收到响应,您将收到此错误。因为超时后IIS会替换应用程序响应客户端'Bad Gateway'.

也许您应该在 web.config 中更改请求时间。

system.webServer / aspNetCore 部分设置 requestTimeout 属性以指定 ASP.NET 核心的持续时间模块将等待侦听 %ASPNETCORE_PORT%.

的进程的响应
  • requestTimeout 必须指定为整分钟,否则默认为 2 分钟。

就像这样:

<system.webServer>
  <aspNetCore requestTimeout="00:20:00" ... />
</system.webServer>

不是对 OP 的这个 502.3 错误的特定实例的直接回答,但如果存在无限循环,它也可能发生,因为我不小心留在我的应用程序中:

public class Category
{
    public Category()
    {
        ParentCategory = new Category();
    }

    Category ParentCategory { get; set; }
}

没有明确的错误表明这是问题所在。希望对大家有帮助。

一个可能的原因是,在您的 API 的 return 语句之后有一些异常。在我的例子中,我在 IActionResult 中返回的对象中有一个循环引用。在调试时,我使用 Newtonsoft.Json.JsonConvert.SerializeObject() 将返回的对象转换为 JSON 格式。这导致从 API 端点返回以下异常:

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'xxx' with type 'xxx'. Path 'xxx'.? at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)