Andrey on .NET | ASP.NET Core: Изменяем лимит на размер загружаемого файла

ASP.NET Core: Изменяем лимит на размер загружаемого файла

ASP.NET Core logoПо умолчанию ASP.NET Core 2.0 ограничивает размер загружаемого файла 30 мегабайтами. В некоторых случаях этого может отказаться мало и тогда необходимо увеличить значение этого ограничения. В других ситуациях, возможно, разработчикам хотелось бы его уменьшить.  В классическом ASP.NET это достигалось за счет изменений в файле конфигурации IIS web.config.Но ASP.NET Core приложение кроссплатформенно и может использоваться на серверах различного типа. Соответственно и вариантов решения проблемы будет несколько.

В общем случае можно сказать, что существует два варианта разворачивания ASP.NET Core веб-приложения:

  • под IIS (с использованием Kestrel или без)
  • с Kestrel (самостоятельно или под IIS, Apache и Ngnix)

Как следствие, для каждого из них существуют свои способы изменения максимального размера для загружаемых файлов.

По умолчанию ASP.NET Core 2.0 устанавливает ограничение на размер загружаемого файла в 30 мегабайтов.

Решение для IIS

1. Изменение конфигурационного файла web.config

Необходимое значение можно задать в файле web.config при помощи параметра "requestLimits".

<?xml version="1.0" encoding="utf-8"?>
 
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore" />
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule"
           resourceType="Unspecified" />
    </handlers>
 
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%"
                stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="[размер в байтах]" />
      </requestFiltering>
    </security>
 
  </system.webServer>
</configuration>

По умолчанию web.config отсутствует в проекте и создается только при его публикации. В этом случае необходимо просто добавить данный файл самостоятельно.

Решения для Kestrel

1. Глобальная конфигурация

Данный подход позволяет установить ограничение, действие которого будет распространяться на всё приложении. Для этого в классе Program (файл Program.cs) необходимо добавить настройку параметра MaxRequestBodySize:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            options.Limits.MaxRequestBodySize = [размер в байтах];
        });

2. Использование атрибутов MVC

В ASP.NET Core, начиная с версии 2.0, существуют два атрибута, которые позволяют установить ограничение на максимальный запроса, а ��начит и загружаемого файла:

  • [RequestSizeLimit(nnn)] – устанавливает ограничение в nnn байт на размер запроса.
  • [DisableRequestSizeLimit] – снимает любые ограничение на размер запроса.

Например:

[HttpPost]
[RequestSizeLimit(40000000)]
public async Task<IActionResult> Upload(IFormFile file)
{
    ...
}
 
[HttpPost]
[DisableRequestSizeLimit]
public async Task<IActionResult> Upload(IFormFile file)
{
    ...
}

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

3. В коде модуля middleware

Модули могут задать собственное значение ограничение на максимальный размер загружаемого файла. Для этого необходимо получить реализацию интерфейса IHttpMaxRequestBodySizeFeature и изменить его свойство MaxRequestBodySize. Значение null будет трактоваться как отмена любых ограничений (аналогично атрибуту [DisableRequestSizeLimit]).

Однако необходимо обратить внимание на еще одно свойство: IsReadOnly. Если оно установление в значение true, то свойство MaxRequestBodySize ведет себя как свойство “только для чтения” и изменить лимит для текущего запроса уже невозможно.

Пример модуля, который будет обрабатывать все запросы к ресурсам, начинающихся с “/api”. В нем установим ограничение в 100МБ

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
    appBuilder.ServerFeatures
        .Get<IHttpMaxRequestBodySizeFeature>()
        .MaxRequestBodySize = 104857600;
    
    // код обработки запроса
});

Комментарии (3) -

Решение для ISS
Очепятка IIS

Спасибо

Андрей 04.08.2022 12:28:20

Спасибо,
RequestSizeLimit помог в RazorPage,
но в Razor Page он ставится перед  классом

[RequestSizeLimit(11111111)]
public class AddBookModel : PageModel
{
}

Добавить комментарий