#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