C# .NET核心Web api调用错误\u连接\u仅在IIS上重置-其他调用正常
我现在完全不知所措 我有一个.NET核心web应用程序,在本地运行,一切正常。这里有许多WebAPI端点,同样,所有这些端点都按照预期使用C# .NET核心Web api调用错误\u连接\u仅在IIS上重置-其他调用正常,c#,asp.net,iis,asp.net-web-api,asp.net-core,C#,Asp.net,Iis,Asp.net Web Api,Asp.net Core,我现在完全不知所措 我有一个.NET核心web应用程序,在本地运行,一切正常。这里有许多WebAPI端点,同样,所有这些端点都按照预期使用GET并正确返回JSON 当我发布到IIS时,这些端点中只有一个停止工作,并抛出(失败)net:ERR\u CONNECTION\u RESET(在Chrome中,其他浏览器抛出自己的错误) 奇怪的是,所有其他Web API调用都在工作,都在相同的环境中,使用相同的上下文和EF数据服务调用相同的数据库 我搞不懂的是,如何将Kestrel的详细日志输入到其他一些
GET
并正确返回JSON
当我发布到IIS时,这些端点中只有一个停止工作,并抛出(失败)net:ERR\u CONNECTION\u RESET
(在Chrome中,其他浏览器抛出自己的错误)
奇怪的是,所有其他Web API调用都在工作,都在相同的环境中,使用相同的上下文和EF数据服务调用相同的数据库
我搞不懂的是,如何将Kestrel的详细日志输入到其他一些日志服务中,比如Windows事件查看器、文本文件、电子邮件或其他任何东西!我没有使用太多的日志中间件,目的是在我们接近生产时将其连接起来
使用.NET core Kestrel web服务器在Windows 2012 R2上的IIS 8中尝试解决此问题的最佳方法是什么?只需编辑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>
“Logging”部分在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">
我也有类似的问题。我使用的是EntityFrameworkCore1.1,它不允许延迟加载。我的错误是由多对多关系中的对象图循环引起的 由于EFCore 1.1不支持多对多开箱即用,因此我的模型有循环引用。我的JSON序列化程序在尝试序列化从控制器类返回的数据时陷入无限循环 如果您有此问题,而其他解决方案都不起作用,我建议更改Startup.cs文件
ConfigureServices()
方法。行services.AddMvc()代码>应更改为:
services.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
编辑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);
我在实体框架核心(父子关系)中使用自引用表 我知道这已被标记为已回答,但以上所有内容都不适用于我。对我来说,解决方案是将web项目从dotnet core 2.1更新到2.2,并同时更新dotnet core SDK。而\logs\stdout
路径是根目录,然后是logs\stdout?这将记录所有错误?是的,这取决于您在AddConsole
中配置的内容。您还可以使用AddDebug
将内容记录到VisualStudio的输出选项卡中(当然,仅在调试期间,意味着连接了调试器时)@RemarlLima-请参阅我的答案,loggerFactory.AddConsole(LogLevel.Trace);将向您显示来自Kestrel的所有日志消息,不仅仅是错误通过IConfiguration override您可以过滤并禁用来自名称空间的消息您不感兴趣Toso您有什么问题吗?对我来说,结果是返回的对象有一个循环引用,即Quotes->Site
和Site->List
,因此JSON
解析器抛出了一个错误-但仅在prod环境中。我更改了方法以返回一个更简单的模型,而不返回引用,并且它工作正常。对我来说,是(在线)数据库数据的差异导致了错误。是数据的序列化导致了错误吗?如果这个答案确实为您解决了这个问题,请检查导致问题的方法是否返回了正确类型的对象(例如某种类型的简单DTO,而不是DbSet本身!)。
services.AddMvc().AddJsonOptions(y => y.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
services.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);