Сегодня я узнал на горьком опыте, что, начиная с ASP.NET Core 2.0, тело запроса получило предел размера по умолчанию в 30 МБ (~ 28,6 МБ).
Если размер тела запроса превышает настроенный максимальный размер тела запроса, вызов Request.Body.ReadAsync вызовет исключение IOException. Если это исключение не перехвачено, Kestrel ответит ответом 413 Payload Too Large, а HttpSys ответит общим ответом 500 Internal Server Error (источник).
Это будет критическим изменением, если ожидается, что ваша конечная точка будет обрабатывать большие загрузки. Решение простое, просто украсьте действие или контроллер MVC атрибутом RequestSizeLimit
, например так:
[HttpPost]
[RequestSizeLimit(100_000_000)]
public IActionResult MyAction([FromBody] MyViewModel data)
{
DisableRequestSizeLimit
можно использовать, чтобы сделать размер запроса неограниченным. Это эффективно восстанавливает поведение до 2.0.0 только для атрибутированного действия или контроллера. Вы также можете изменить или отключить ограничение программно, как для каждого запроса, так и глобально (см. инструкции по этой ссылке).
Однако в моем случае отключения лимита запросов было недостаточно. Поскольку моя конечная точка ожидает аргумент IFormFile
, мне также пришлось установить атрибут RequestFormLimits
:
[HttpPost]
[DisableRequestSizeLimit,
RequestFormLimits(MultipartBodyLengthLimit = int.MaxValue,
ValueLengthLimit = int.MaxValue)]
public async Task<ActionResult> BulkAdd(string schema, IFormFile file)
{
Обратите внимание, что все это произошло в приложении .NET 5 Linux с Kestrel, работающим за nginx. Как указано в приведенной выше ссылке, если вы используете IIS, ограничение отключено, и применяется обычное ограничение web.config.
Для справки в будущем здесь указаны текущие лимиты сервера Kestrel.
Первоначально опубликовано на моем веб-сайте.