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

C1X*_*C1X 3 c# sql-server azure-devops aspnetboilerplate asp.net-core-2.2

我正在使用用 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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但问题并没有解决。

Mat*_*hew 13

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

错误请求的两种可能情况是:

Content-Length标头不正确

如果Content-Length的值大于请求正文中传递的字节数。

不好的例子:

POST /path HTTP/1.1
Content-Length: 15
Content-Type: text/plain

ABCDEFG
Run Code Online (Sandbox Code Playgroud)

其中请求正文是7字符长,但标头指示它应该是15.

在这种情况下,服务器将等待8传输剩余的字节,这永远不会发生,从而迫使错误发生。

好例子:

POST /path HTTP/1.1
Content-Length: 7
Content-Type: text/plain

ABCDEFG
Run Code Online (Sandbox Code Playgroud)

错误终止的Transfer-Encoding: chunked消息

使用ifTransfer-Encoding: chunked代替Content-Lengthand 但请求者无法发出正文结束序列。

不好的例子:

POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain

4
ABCD
1
E
2
FG
Run Code Online (Sandbox Code Playgroud)

上面的示例需要另外0跟随两个换行符 ( \r\n\r\n) 来指示请求正文的结束。

好例子:

POST /path HTTP/1.1
Transfer-Encoding: chunked
Content-Type: text/plain

4
ABCD
1
E
2
FG
0

Run Code Online (Sandbox Code Playgroud)


小智 9

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

由于数据到达太慢,读取请求正文超时。请参阅 MinRequestBodyDataRate。

但是您正在尝试设置MinResponseDataRate.

请考虑更新MinRequestBodyDataRate

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

默认值为:

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

你可以这样改变:

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