繁体   English   中英

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 服务器。

有时,当后端有很多请求要处理时,它会记录此异常:

错误 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();
            }
        }
    }

但问题并没有解决。

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

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

但是您正在尝试设置MinResponseDataRate

请考虑更新MinRequestBodyDataRate

而不是将 value 设置为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并且请求者未能省略 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来指示请求正文的结束。

好的例子:

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

4
ABCD
1
E
2
FG
0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM