Reputation: 795
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
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:
Content-Length
headerIf 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
Transfer-Encoding: chunked
messageIf 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
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
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