Назад | Перейти на главную страницу

IIS случайным образом возвращает 413 Request Entity Too Large при загрузке больших файлов и использовании TLS

У меня есть приложение ISAPI, работающее на IIS, которое предназначено для поддержки загрузки файлов любого размера. На одном сервере загрузка, казалось бы, случайным образом завершается неудачно с 413 Request Entity Too Large или тайм-аут при использовании HTTPS, и кажется, что единственным выходом является установка uploadReadAheadSize на значение больше, чем загруженный файл. Однако это ограничит размер загружаемых файлов до 2 ГБ (максимальное значение uploadReadAheadSize), что недопустимо.

Что могло быть причиной этого и как мне это отладить?

(ПРИМЕЧАНИЕ: я встречал несколько похожих вопросов в StackOverflow и здесь, но в этих сценариях предполагается использовать либо клиентские сертификаты, либо приложение основано на WCF, чего у нас нет, либо проблема не зависела от uploadReadAheadSize или TLS)

Кроме того, что является хорошим источником для понимания того, что uploadReadAheadSize собственно и что происходит «под капотом»? Официальная документация Microsoft довольно скудна.

Получил аналогичную ошибку в IIS Express с Visual Studio 2017, и на самом деле это было uploadReadAheadSize.

Ошибка:

Ошибка HTTP 413.0 - слишком большой объект запроса

Страница не была отображена из-за слишком большого размера объекта запроса.

Наиболее вероятные причины:

  • Веб-сервер отказывается обслуживать запрос, потому что объект запроса слишком велик.

  • Веб-сервер не может обработать запрос, потому что он пытается согласовать сертификат клиента, но объект запроса слишком велик.

  • URL-адрес запроса или физическое сопоставление с URL-адресом (т. Е. Путь физической файловой системы к содержимому URL-адреса) слишком длинный.

Что вы можете попробовать:

  • Убедитесь, что запрос действителен.

  • При использовании клиентских сертификатов попробуйте:

    • Увеличение system.webServer/serverRuntime@uploadReadAheadSize

    • Настройте конечную точку SSL для согласования клиентских сертификатов в рамках первоначального подтверждения SSL. (netsh http add sslcert ... clientcertnegotiation = enable) .vs \ config \ applicationhost.config

Здесь добавлено решение, но тот же принцип можно использовать и для реального IIS. редактировать \.vs\config\applicationhost.config. Переключатель serverRuntime из Deny к Allow как это:

<section name="serverRuntime" overrideModeDefault="Allow" />

Затем отредактируйте Web.config со следующими значениями:

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...