AspNetCore(Kestrel)请求超时

时间:2018-03-08 07:37:05

标签: c# asp.net-core task kestrel-http-server

我正在进行以下设置:在应用程序负载均衡器(AWS)后面的几个Linux容器(构建在aspnetcore 2.0.5上)中运行的web api

使用HttpClient向此api发出请求的客户端。客户端并行运行多个任务的调用。如果并行任务的数量增加,则api开始抛出异常并显示消息“请求超时。”

调用堆栈是:

  

在   Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.PipeCompletion.ThrowFailed()   在   Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.GetResult(ReadResult&安培;   结果)在   Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.Pipe.Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.IReadableBufferAwaiter.GetResult()   在   Microsoft.AspNetCore.Server.Kestrel.Internal.System.IO.Pipelines.ReadableBufferAwaitable.GetResult()   在   Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.d__24.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)   Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.d__2.MoveNext()

导致此错误的是什么,谁设置了超时,我该如何进一步调查?

编辑:如果我尝试使用fiddler来捕获失败的请求,则不再抛出错误(也许fiddler正在以较低程度的并行性打开连接)。

1 个答案:

答案 0 :(得分:0)

一个可能的原因是由于I / O绑定操作,您正在阻止asp.net线程。从问题描述看来,您的服务器似乎正在处理请求到某一点。除此之外,它无法做到这一点。

我认为如果您正确使用Async / Await,那么您可以提供比当前限制更多的并发请求。

如果可以增加Asp.Net线程的数量,还可以通过配置检查。传统的Asp.Net支持这一点。不确定Asp.Net Core是否具有此功能。

最后,由于您在云中运行,请检查升级服务器配置的可行性。可能是升级配置将帮助您更多的服务器请求。显然这应该是最后的选择。首先关注使用现有硬件提高应用程序的性能。