HTTP 413 — Объект запроса слишком большая шпаргалка

#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>