По умолчанию 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;
// код обработки запроса
});