繁体   English   中英

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

[英].NET Core Web api call ERR_CONNECTION_RESET only on IIS - other calls working

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

我有一个.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中尝试解决此问题的最佳方法是什么?

我遇到了类似的问题。 我正在使用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);

只需编辑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();
    ...
}

“记录”部分在appsettings.json中配置,例如

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

您可以使用内置日志记录中间件记录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);
}

编辑Startup.cs并将其替换为: services.AddMvc()

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

我在startup.cs中添加了以下代码并且它有效。

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

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

我知道这已被标记为已回答,但上述内容均不适合我。 对我来说,解决方案是将web项目从dotnet core 2.1更新到2.2并更新dotnet核心SDK。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM