我正在使用使用 ASP.NET core 2.2 开发的 aspnetboilerplate 解决方案。 后端部署在azure上,并使用提供的SQL服务器。
有时,当后端有很多请求需要处理时,它会记录以下异常:
错误 2020-11-20 12:28:21,968 [85] Mvc.ExceptionHandling.AbpExceptionFilter - 由于数据到达太慢,读取请求正文超时。请参阅 MinRequestBodyDataRate。 Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException:由于数据到达速度太慢,读取请求正文超时。请参阅 MinRequestBodyDataRate。
我尝试将此代码添加到我的 Program.cs 中来解决此问题
namespace WorkFlowManager.Web.Host.Startup
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel(options =>
{
options.Limits.MinResponseDataRate = null;
});
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
}
但是问题并没有解决。
您共享的异常表明应用程序在“读取”请求时出现问题。
由于数据到达太慢,读取请求体超时。看 最小请求正文数据速率。
但是您正在尝试设置
MinResponseDataRate
。
请考虑更新
MinRequestBodyDataRate
。
并且不要将值设置为
null
,请检查文档并尝试为请求设置有意义的值。
默认值为:
默认最小速率为 240 字节/秒,有 5 秒宽限 期间。
你可以这样改变:
.UseKestrel(options =>
{
options.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});
除了接受的答案之外,这也可能是由于请求标头与请求正文不一致所致。
不良请求的两种可能情况是:
Content-Length
标题如果
Content-Length
的值大于请求正文中传递的字节数。
不好的例子:
POST /path HTTP/1.1
Content-Length: 15
Content-Type: text/plain
ABCDEFG
请求正文的长度为
7
个字符,但标头指示其长度应为 15
。
在这种情况下,服务器将等待
8
剩余字节被传输,这永远不会发生,从而迫使错误发生。
好例子:
POST /path HTTP/1.1
Content-Length: 7
Content-Type: text/plain
ABCDEFG
Transfer-Encoding: chunked
消息如果使用
Transfer-Encoding: chunked
代替 Content-Length
并且请求者未能发出正文结束序列。
不好的例子:
POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain
4
ABCD
1
E
2
FG
上面的示例需要在两个换行符 (
0
) 之后额外添加 \r\n\r\n
来指示请求正文的结束。
好例子:
POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain
4
ABCD
1
E
2
FG
0
.NET 7
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(o => {
o.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});