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

时间:2016-09-28 19:25:58

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

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

作为一个完整性检查,我成功地从Visual Studio 2015发布了模板/示例“ASP.NET Core Web Application(.NET Framework)”应用程序。

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

该站点正在从Visual Studio运行IIS Express。

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

  

Error 502.3

的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"
    ]
  ]
 }
}

5 个答案:

答案 0 :(得分:10)

  

我该如何调试?有人有主意吗?

以下是三个想法:

  1. Read this并确保您已覆盖所有内容。

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

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

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

  5. 事件查看器应用程序日志

    Event Viewer Application Logs

答案 1 :(得分:9)

如果您长时间运行任务,并且Web浏览器在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>

答案 2 :(得分:2)

解决方案对我不起作用,但是做了什么:

启用网络开发者模式(在浏览器中按F12)=&gt; application tab =&gt;然后删除所有cookie。 刷新页面并vo:它有效。 您也可以复制您的URL并粘贴到另一个未运行任何MVC项目的浏览器。

我的项目在Internet Explorer和Microsoft Edge上运行,没有任何更改。 也许这就是你错误的原因。

答案 3 :(得分:0)

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

fn main() {
    let mut score = Some(42i32);

    let res = if let Some(41) = score {
        println!("41 is matched");
        1i32
    } else if let Some(ref mut s) = score { //&mut score {
        //let mut s2 = s;
        //println!("s: {:#?}", s);
        test(&mut &mut *s); // This part may be like this for borrowing
        //println!("s: {:#?}", s);
        1i32
    } else {
        0i32
    };

    //println!("Result: {:#?}", score);
    assert_eq!(res, 1i32);
}

fn test(ref mut s: &mut &mut i32) -> i32 {
    //let mut s2 = s;
    return test2(&mut *s);
}

fn test2(n: &mut i32) -> i32 {
    *n += 1;
    //println!("Value: {}", *(*n));
    return *n;
}

没有明显的错误表明这是问题所在。希望对别人有帮助。

答案 4 :(得分:0)

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

Newtonsoft.Json.JsonSerializationException:为类型为“ xxx”的属性“ xxx”检测到自引用循环。路径“ xxx”。?在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference中(JsonWriter编写器,对象值,JsonProperty属性,JsonContract合同,JsonContainerContract containerContract,JsonProperty containerProperty)