BadHttpRequestException:由于数据到达太慢,读取请求正文超时。请参阅 ASP.NET core 2.2 上的 MinRequestBodyDataRate

问题描述 投票:0回答:3

我正在使用使用 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();
            }
        }
    }

但是问题并没有解决。

c# sql-server azure-devops aspnetboilerplate asp.net-core-2.2
3个回答
20
投票

您共享的异常表明应用程序在“读取”请求时出现问题。

由于数据到达太慢,读取请求体超时。看 最小请求正文数据速率。

但是您正在尝试设置

MinResponseDataRate

请考虑更新

MinRequestBodyDataRate

并且不要将值设置为

null
,请检查文档并尝试为请求设置有意义的值。

默认值为:

默认最小速率为 240 字节/秒,有 5 秒宽限 期间。

你可以这样改变:

.UseKestrel(options =>
    {
        options.Limits.MinRequestBodyDataRate =
            new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    });

12
投票

除了接受的答案之外,这也可能是由于请求标头与请求正文不一致所致。

不良请求的两种可能情况是:

不正确的
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


2
投票

.NET 7

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(o => {
    o.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});
© www.soinside.com 2019 - 2024. All rights reserved.