.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?
这里有三个想法:
Read this 并确保您已经涵盖了它所说的所有内容。
运行 从命令行发布 .\MyApp.exe
。那样有用吗?
- 如果是,则说明您遇到了 IIS 集成问题。
- 如果没有,则表明您遇到了应用程序问题。
将 stdoutLogEnabled="false"
更改为 true
,然后检查 stdoutLogFile=".\logs\stdout"
处的日志。那里的错误可能会告诉你一些事情。
在事件查看器中检查您的 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)
我正在尝试向 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?
这里有三个想法:
Read this 并确保您已经涵盖了它所说的所有内容。
运行 从命令行发布
.\MyApp.exe
。那样有用吗?- 如果是,则说明您遇到了 IIS 集成问题。
- 如果没有,则表明您遇到了应用程序问题。
将
stdoutLogEnabled="false"
更改为true
,然后检查stdoutLogFile=".\logs\stdout"
处的日志。那里的错误可能会告诉你一些事情。在事件查看器中检查您的 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)