413 слишком большой объект запроса — Веб-API

#c# #asp.net-core #iis #middleware

Вопрос:

Я столкнулся с проблемой 413 при попытке отправить данные из моего веб-приложения (.netfx 4.6.1) в мой веб-api (.net core 3.1). В приведенном ниже коде я отправляю список, содержащий байтовые данные изображений вместе с дополнительными данными, необходимыми для создания файла. Ожидаемый результат — возврат массива байтов, содержащего новый файл. К сожалению, при отправке запроса я получаю ошибку: Код состояния ответа не указывает на успех: 413 (Объект запроса Слишком большой).

Ошибка, по-видимому, возникает только тогда, когда файл изначально большой, что имеет смысл. Исследование, которое я провел, похоже, указывает на настройки в IIS, основными из которых являются maxAllowedContentLength, maxRequestLength и uploadReadAheadSize. Я пытался увеличить эти значения до значений, более подходящих для этого процесса, но, похоже, ничего не работает. Я настроил их как для веб-приложения, так и для веб-api, так как не был уверен, какой из них вызывает проблему.

В чем заключается проблема? В приложении, API или и в том, и в другом? Есть ли дополнительная настройка, которой мне не хватает, чтобы разрешить увеличение размера? Есть ли проблема с тем, как я отправляю запрос? Любая помощь будет признательна.

     public static async Task<byte[]> CreatePdfFromImageFilesAsync(List<ImageFile> imageFiles)
    {
        var list = new List<dynamic>();
        foreach (var item in imageFiles)
        {
            list.Add(new
            {
                Data = Convert.ToBase64String(item.Bytes),
                PageOrder = item.PageOrder,
                Rotation = item.Rotation,
                Type = "PDF"
            });
        }

        var response = _client.PostAsJsonAsync($"{FileCreatorAPI}/api/files/CreateFileFromMultiple", list).Resu<
        var result = response.EnsureSuccessStatusCode();
        var bytes = await result.Content.ReadAsAsync<byte[]>();
        return bytes;
    }
 

Ответ №1:

Приведенные ниже изменения сработали для меня

                 // If using Kestrel:
                .Configure<KestrelServerOptions>(options =>
                {
                    options.AllowSynchronousIO = true;
                    //options.Limits.MaxRequestBodySize = null; --did not worked
                    options.Limits.MaxRequestBodySize = int.MaxValue;
                })
                // If using IIS:
                .Configure<IISServerOptions>(options =>
                {
                    options.AllowSynchronousIO = true;
                    //options.MaxRequestBodySize = null;
                    options.MaxRequestBodySize = int.MaxValue;
                });
 

создайте файл web.config и добавьте следующую конфигурацию

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483648" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>
 

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

1. Изменения конфигурации достаточно, .Configure<IISServerOptions> не требуется.

Ответ №2:

Можете ли вы проверить этот атрибут https://github.com/aspnet/Announcements/issues/267 ? С помощью

 [RequestSizeLimit(100_000_000)] 
 

на вашей точке входа контроллера или более глобально установите ее таким образом:

 .UseKestrel(options =>
{
    options.Limits.MaxRequestBodySize = null;
 

РЕДАКТИРОВАТЬ: статья из MS: https://dotnet.microsoft.com/download/dotnet-core

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

1. Я добавил атрибут, но получил тот же результат.

2. У меня есть эта настройка web.config с указанными вами параметрами, и она устраняет ошибку HTTP 413. Вы сочетаете в себе и то, и другое?

3. Да, у меня есть обе части, добавленные в мое приложение, и оно по-прежнему дает один и тот же ответ.

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

Ответ №3:

Я думаю, что проблема в сервере. Сервер завершает запрос, поскольку он превышает заданный максимально допустимый размер запроса.

Какой сервер вы используете? Для пользователей Nginx директива, определяющая допустимый размер HTTP-запроса client_max_body_size , гласит, что по умолчанию максимально допустимый размер запроса составляет 1 МБ. Ограничение в Apache устанавливается с помощью директивы LimitRequestBody и по умолчанию равно 0 (то есть неограниченно) 2147483647 (2 ГБ).

Ознакомьтесь с этой статьей о том, как это можно исправить, если вы используете любой из этих двух серверов.