#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 ГБ).
Ознакомьтесь с этой статьей о том, как это можно исправить, если вы используете любой из этих двух серверов.