C1X
C1X

Reputation: 795

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.

Upvotes: 17

Views: 26784

Answers (3)

Matthew
Matthew

Reputation: 25773

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 emit 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

Upvotes: 15

Goran Hrovat
Goran Hrovat

Reputation: 41

.NET 7

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(o => {
    o.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});

Upvotes: 4

Ozan Aydın
Ozan Aydın

Reputation: 461

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));
    });

Upvotes: 21

Related Questions