.NET Core Web api仅在IIS上调用ERR_CONNECTION_RESET - 其他调用工作

时间:2017-01-05 16:13:50

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

我现在完全失去了......

我有一个.NET Core Web应用程序,并在本地运行一切正常。有许多WebAPI端点,所有端点都按预期与GET一起正常工作并正确返回JSON。

当我发布到IIS时,只有一个端点停止工作并抛出(failed) net:ERR_CONNECTION_RESET(在Chrome中 - 其他浏览器会抛出自己的错误)。

奇怪的是,所有其他Web API调用都在同一个环境中并使用相同的上下文和EF数据服务调用同一个数据库。

我能弄清楚的是,如何从Kestrel获取详细日志到其他日志服务,Windows事件查看器,文本文件,电子邮件或其他任何内容!我没有使用太多的日志记录中间件,我们打算在接近生产时将其挂起来。

使用.NET核心Kestrel Web服务器在Windows 2012 R2上的IIS 8中尝试解决此问题的最佳方法是什么?

6 个答案:

答案 0 :(得分:12)

我有类似的问题。我正在使用Entity Framework Core 1.1,它不允许延迟加载。我的错误是由多对多关系中的对象图循环引起的。

由于EFCore 1.1不支持开箱即用的多对多,我的模型有循环引用。我的JSON Serializer在尝试序列化从我的控制器类返回的数据时陷入无限循环。

如果您遇到此问题并且其他解决方案均无效,我建议您更改Startup.cs文件ConfigureServices()方法。行services.AddMvc();应更改为:

services.AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

答案 1 :(得分:4)

只需编辑web.config并将stdoutLogEnabled="true"设置为true,并设置将日志文件写入的路径。

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

  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->

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

但是你需要至少启用控制台记录器,因为它基本上将控制台输出变为文件。

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();
    ...
}

&#34;记录&#34; section在appsettings.json中配置,例如

  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }

答案 2 :(得分:1)

您可以使用内置日志记录中间件记录Kestrel。确保通过stdoutLogEnabled在web.config中启用日志记录,如下所示:

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">

您的startup.cs包含以下代码:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(LogLevel.Trace);
}

答案 3 :(得分:0)

修改 Startup.cs 并将其替换为services.AddMvc()

services.AddMvc().AddJsonOptions(y => y.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

答案 4 :(得分:0)

我在startup.cs中添加了以下代码,并且可以正常工作。

services.AddMvc()
    .AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

我在Entity Framework Core(父子关系)中使用了自引用表。

答案 5 :(得分:0)

我知道这已被标记为已回答,但是以上都不对我有用。对我来说,解决方案是将Web项目从dotnet core 2.1更新到2.2,并同时更新dotnet core SDK。