BadHttpRequestException: время ожидания чтения тела запроса истекло из-за слишком медленного поступления данных. См. Раздел MinRequestBodyDataRate на ASP.NET ядро 2.2

#c# #sql-server #azure-devops #aspnetboilerplate #asp.net-core-2.2

#c# #sql-сервер #azure-devops #котловая плита aspnetboilerplate #asp.net-core-2.2

Вопрос:

Я использую решение aspnetboilerplate, разработанное с ASP.NET ядро 2.2 . Серверная часть развернута в Azure и использует предоставленный SQL server.

Иногда, когда серверной части приходится обрабатывать много запросов, она регистрирует это исключение:

ОШИБКА 2020-11-20 12:28:21 968 [85 ] Mvc.Обработка исключений.AbpExceptionFilter — время ожидания чтения тела запроса истекло из-за слишком медленного поступления данных. См. раздел MinRequestBodyDataRate . Майкрософт.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();
            }
        }
    }
 

Но проблема не решена.

Комментарии:

1. для меня решением было установить значение null. netcore 3.1

Ответ №1:

Исключение, которым вы поделились, указывает на то, что у приложения возникла проблема при «чтении» запроса.

Время ожидания чтения тела запроса истекло из-за слишком медленного поступления данных. См. раздел MinRequestBodyDataRate .

Но вы пытаетесь установить MinResponseDataRate .

Пожалуйста, подумайте об обновлении MinRequestBodyDataRate .

И вместо того, чтобы устанавливать значение null равным, пожалуйста, изучите документацию и попытайтесь установить значимые значения для запроса.

Значения по умолчанию следующие:

Минимальная скорость по умолчанию составляет 240 байт /с с 5-секундным льготным периодом.

И вы можете изменить это следующим образом:

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

Комментарии:

1. я попробовал ваше решение, но проблема все еще возникает..

2. Вы пытались изменить bytesPerSecond и GracePeriod в соответствии с вашими потребностями? Эти значения были приведены только для примера.

3. oook, с новым параметром MinDataRate(байтовая секунда: 100, GracePeriod: TimeSpan.FromSeconds(15)); проблема решена. Спасибо!

4. @C1X не могли бы вы добавить свое использование… строка и / или требуемый пакет? У меня такая ошибка: не удалось найти тип или имя пространства имен ‘MinDataRate’ (вам не хватает директивы using или ссылки на сборку?)

5. Почему его значение null является «плохим»?

Ответ №2:

В качестве альтернативы принятому ответу это также может быть связано с тем, что заголовки запроса не согласуются с телом запроса.

Два возможных сценария ошибочных запросов:

Неправильный Content-Length заголовок

Если значение Content-Length ‘s больше, чем количество байтов, переданных в теле запроса.

Плохой пример:

 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 и используется If, но запрашивающему не удается пропустить последовательность конца тела.

Плохой пример:

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

4
ABCD
1
E
2
FG
 

Где в приведенном выше примере потребуется дополнительно 0 следовать двум символам новой строки ( rnrn ), чтобы указать конец тела запроса.

Хороший пример:

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

4
ABCD
1
E
2
FG
0