简体   繁体   中英

BadHttpRequestException: Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate on ASP.NET core 2.2

I'm using aspnetboilerplate solution developed with ASP.NET core 2.2 . The backend is deployed on azure and it uses the SQL server provided.

Sometimes, when the backend has a lot of requests to handle, it logs this exception:

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.

I tried to solve this problem adding this code to my 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();
            }
        }
    }

But the problem is not solved.

The exception you have shared indicates that application has a problem while "reading" the request.

Reading the request body timed out due to data arriving too slowly. See MinRequestBodyDataRate.

But you are trying to set MinResponseDataRate .

Please consider to update MinRequestBodyDataRate .

And instead of setting value to null , please examine the documentation and try to set meaningful values for request.

Default values are:

The default minimum rate is 240 bytes/second with a 5 second grace period.

And you can change like this:

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

Alternatively to the accepted answer, this can also be due to the request headers not being consistent with the request body.

Two possible scenarios of bad requests are:

Incorrect Content-Length header

If the Content-Length 's value is larger than the number of bytes passed in the request body.

Bad example:

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

ABCDEFG

Where the request body is 7 characters long, but the header indicates it should be 15 .

In this scenario the server will be waiting for 8 remaining bytes to be transmitted, which will never happen, forcing the error to occur.

Good example:

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

ABCDEFG

Improperly terminated Transfer-Encoding: chunked message

If Transfer-Encoding: chunked is used instead of Content-Length and but the requestor fails to omit the end-of-body sequence.

Bad example:

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

4
ABCD
1
E
2
FG

Where the above example would need additionally 0 following two newlines ( \\r\\n\\r\\n ) to indicate the end of the request body.

Good example:

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

4
ABCD
1
E
2
FG
0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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