BadHttpRequestException:由于数据到达太慢,读取请求正文超时。请参阅 ASP.NET 核心 2.2 上的 MinRequestBodyDataRate
BadHttpRequestException: Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate on ASP.NET core 2.2
我正在使用用 ASP.NET core 2.2 开发的 aspnetboilerplate 解决方案。
后端部署在 azure 上,它使用提供的 SQL 服务器。
有时候,当后端有很多请求要处理时,它会记录这个异常:
ERROR 2020-11-20 12:28:21,968 [85 ] Mvc.ExceptionHandling.AbpExceptionFilter - Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate.
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Reading the request body timed out due to data arriving too slowly. See 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();
}
}
}
但是问题并没有解决
您共享的异常表明应用程序在“读取”请求时出现问题。
Reading the request body timed out due to data arriving too slowly. See
MinRequestBodyDataRate.
但是您正在尝试设置 MinResponseDataRate
。
请考虑更新 MinRequestBodyDataRate
。
请检查 documentation 并尝试为请求设置有意义的值,而不是将值设置为 null
。
默认值为:
The default minimum rate is 240 bytes/second with a 5 second grace
period.
你可以这样改:
.UseKestrel(options =>
{
options.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});
除了已接受的答案,这也可能是由于请求 header 与请求 body 不一致。
错误请求的两种可能情况是:
不正确Content-Length
header
如果Content-Length
的值大于请求中传递的字节数body。
不好的例子:
POST /path HTTP/1.1
Content-Length: 15
Content-Type: text/plain
ABCDEFG
请求 body 的长度为 7
个字符,但 header 表明它应该是 15
.
在这种情况下,服务器将等待 8
剩余字节被传输,这种情况永远不会发生,从而导致错误发生。
好例子:
POST /path HTTP/1.1
Content-Length: 7
Content-Type: text/plain
ABCDEFG
不正确终止Transfer-Encoding: chunked
消息
如果使用 Transfer-Encoding: chunked
而不是 Content-Length
并且请求者未能省略 end-of-body 序列。
不好的例子:
POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain
4
ABCD
1
E
2
FG
上面的例子需要在两个换行符 (\r\n\r\n
) 之后额外地 0
来指示请求的结束 body.
好例子:
POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain
4
ABCD
1
E
2
FG
0
我正在使用用 ASP.NET core 2.2 开发的 aspnetboilerplate 解决方案。 后端部署在 azure 上,它使用提供的 SQL 服务器。
有时候,当后端有很多请求要处理时,它会记录这个异常:
ERROR 2020-11-20 12:28:21,968 [85 ] Mvc.ExceptionHandling.AbpExceptionFilter - Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate. Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Reading the request body timed out due to data arriving too slowly. See 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();
}
}
}
但是问题并没有解决
您共享的异常表明应用程序在“读取”请求时出现问题。
Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate.
但是您正在尝试设置 MinResponseDataRate
。
请考虑更新 MinRequestBodyDataRate
。
请检查 documentation 并尝试为请求设置有意义的值,而不是将值设置为 null
。
默认值为:
The default minimum rate is 240 bytes/second with a 5 second grace period.
你可以这样改:
.UseKestrel(options =>
{
options.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});
除了已接受的答案,这也可能是由于请求 header 与请求 body 不一致。
错误请求的两种可能情况是:
不正确Content-Length
header
如果Content-Length
的值大于请求中传递的字节数body。
不好的例子:
POST /path HTTP/1.1
Content-Length: 15
Content-Type: text/plain
ABCDEFG
请求 body 的长度为 7
个字符,但 header 表明它应该是 15
.
在这种情况下,服务器将等待 8
剩余字节被传输,这种情况永远不会发生,从而导致错误发生。
好例子:
POST /path HTTP/1.1
Content-Length: 7
Content-Type: text/plain
ABCDEFG
不正确终止Transfer-Encoding: chunked
消息
如果使用 Transfer-Encoding: chunked
而不是 Content-Length
并且请求者未能省略 end-of-body 序列。
不好的例子:
POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain
4
ABCD
1
E
2
FG
上面的例子需要在两个换行符 (\r\n\r\n
) 之后额外地 0
来指示请求的结束 body.
好例子:
POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain
4
ABCD
1
E
2
FG
0