#asp.net-mvc #iis #.net-core
#asp.net-mvc #iis #.net-core
Вопрос:
Я пытаюсь загрузить большой файл на свой ASP.net сайт core / ASP.net mvc, но продолжайте сталкиваться с HTTP 413 — объект запроса слишком большой. Даже когда я пытаюсь обновить web.config, другие вещи все равно ломаются. У кого-нибудь есть шпаргалка для решения этой проблемы?
Ответ №1:
Я создал asp.net приложение mvc и попытался протестировать его.
Часто мы обращаем внимание только на настройку uploadReadAheadSize, но тесты показали, что это не может полностью решить проблему, и есть другие конфигурации, которые необходимо настроить. (Добавлено на основе ответа Джека)
В дополнение к установке большего значения uploadReadAheadSize существуют также maxAllowedContentLength и maxRequestLength . Вам необходимо изменить все эти три значения, иначе ошибка 413 или превышение максимальной длины запроса все равно будет отображаться.
В моих результатах тестирования приложение может загружать файлы любого типа в пределах 1 ГБ.
Комментарии:
1. Отлично! Все 3 настройки должны быть изменены. Спасибо.
Ответ №2:
Вот моя шпаргалка:
Ограничение максимального размера файла, поступающего из IIS, задается с помощью параметра UploadReadAhaead, который можно указать в web.config таким образом. В этом случае максимальное значение равно 1000485760 байт
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Detailed"></httpErrors>
<serverRuntime uploadReadAheadSize="1000485760" />
<httpErrors errorMode="Detailed" />
<asp scriptErrorSentToBrowser="true"/>
</system.webServer>
<system.web>
<customErrors mode="Off"/>
<compilation debug="true"/>
</system.web>
</configuration>
Это грандиозно, если этот спецификатор действительно работает. Вам может понадобиться другое решение, скажем, если вы размещаете локально с помощью чего-то другого, кроме IIS (например, kestrel или даже IIS express).)
Иногда этот раздел конфигурации также заблокирован, и в этом случае его можно разблокировать с помощью следующей команды (запустите cmd от имени администратора):
%windir%system32inetsrvappcmd.exe unlock config -section:system.webServer/serverRuntime
Это также следует учитывать при настройке prod. В некоторых случаях ваша конфигурация в web.config в вашем коде для uploadReadAheadSize может конфликтовать с тем, что указано в вашем экземпляре prod. Что касается меня, я в конечном итоге избавился от своей конфигурации в системе управления версиями и вместо этого установил значение uploadReadAhead для prod во время настройки среды. Я сделал это, выполнив команду (в cmd от имени администратора):
appcmd set config "https://example.com" /section:system.webserver/serverruntime /uploadreadaheadsize:500048576 /commit:apphost
appcmd set config "http://example.com" /section:system.webserver/serverruntime /uploadreadaheadsize:500048576 /commit:apphost
Я также установил uploadReadAheadSize внутри C:inetpubwwwrootweb.config на сервере prod также, так что это выглядит примерно так:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<serverRuntime uploadReadAheadSize="500485760" />
<!--If this line breaks, unlock the config by opening cmd as admin and running %windir%system32inetsrvappcmd.exe unlock config -section:system.webServer/serverRuntime-->
</system.webServer>
</configuration>
Это также можно установить в соответствии с этим скриншотом:
[![введите описание изображения здесь][1]][1]
Теперь, когда вы это настроили, все еще вполне возможно, что ваше приложение выйдет из строя, что даст вам 413, потому что, хотя IIS может быть настроен правильно, в экосистеме .net core также существуют ограничения на загрузку, которые могут выдавать ошибку HTTP 414 при обработке больших файлов.Это то, что я узнал [здесь] [2]
TLDR этого заключается в том, что вы хотите иметь следующий код в вашем startup.cs -> ConfigureServices()
services.Configure<IISServerOptions>(options => {
options.MaxRequestBodySize = int.MaxValue;
});
services.Configure<FormOptions>(x =>
{
x.ValueLengthLimit = int.MaxValue;
x.MultipartBodyLengthLimit = int.MaxValue;
x.BufferBodyLengthLimit = int.MaxValue;
x.MultipartBoundaryLengthLimit = int.MaxValue;
});
Обратите внимание, что там есть код, если вы размещаете для kestrel, а не IIS, также
[1]: https://i.stack.imgur.com/yLHQQ.png
[2]: https://github.com/dotnet/aspnetcore/issues/20369#issuecomment-607057822
Ответ №3:
Это работает для меня. Установите его в своем web.config
разделе configuration
:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="999999999" />
</requestFiltering>
</security>
</system.webServer>