我现在完全失去了......
我有一个.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中尝试解决此问题的最佳方法是什么?
答案 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。