Ответ 1
Вопрос задавался конкретно о тайм-аутах, но также подразумевал установку maxRequestLength. Я попытаюсь дать действительно исчерпывающий ответ на оба вопроса (теперь, когда я провел большую часть рабочего дня).
Допустим, у нас есть один URL-адрес нашего веб-сайта, который мы хотим обрабатывать загрузки файлов. Мы хотим довести до Gigabyte данные по этому URL-адресу, и мы разрешим клиентам подключаться максимум максимум на 1 час. Все остальные URL-адреса, которые мы хотим разрешить только 90 секунд времени соединения и максимум 4 МБ в теле POST.
Глобальные настройки
Сначала вы должны глобально повысить лимиты по времени и размеру для всего сайта. Сначала вы хотите установить "Тайм-аут соединения" для всего сайта. Он действует как абсолютная верхняя граница и не может быть установлен изнутри web.config. На веб-сайте IIS7 есть полезные инструкции здесь. Вы также можете сделать это программно с помощью библиотеки Microsoft.Web.Administration
, которая поставляется с IIS7/7.5:
var serverManager = ServerManager.OpenRemote("\\web-server-name");
var site = serverManager.Sites["Your-Site-Name"];
site.Limits.ConnectionTimeout = new TimeSpan(1, 0, 0);
Затем вам нужно установить запрос максимального размера, который разрешит сайт. Это совсем другое место в модуле Request Fitlering. Этот модуль не может быть установлен по умолчанию на IIS7. Снова Microsoft имеет хорошие инструкции о том, как установить maxAllowedContentLength
через графический интерфейс. Это то, что вы можете установить из Web.config:
<system.webServer>
<security>
<requestFiltering>
<!-- Allow 1GB uploads -->
<requestLimits maxAllowedContentLength="1073741824"></requestLimits>
</requestFiltering>
</security>
</system.webServer>
Этот параметр оценивается с заголовком Content-Length
, и запросы, превышающие это, немедленно приведут к 404.13. Параметр находится в байтах, а следующий - в Kilobytes, очень соответствующий этому IIS7.
Настройки ASP.NET
Далее мы хотим ограничить все запросы ASP.NET на 90 секунд /4 МБ. Это можно сделать в файле web.config:
<location>
<system.web>
<httpRuntime executionTimeout="90" maxRequestLength="4096" />
</system.web>
</location>
Чтобы сделать глобальные настройки, тег system.web
обернут тегом location
, который не имеет атрибута path
. (В исходном вопросе я не обернул тег system.web в теге местоположения, который, вероятно, был источником моей проблемы.) maxRequestLength
на этот раз находится в килобайтах.
Наконец, мы хотим, чтобы наш специальный URL-адрес загрузки принимал огромные загрузки. Установка этих значений выше, чем те, которые вы установили глобально, не будут работать. Глобальные значения переопределяют эти параметры.
<location path="Uploads/PostFile.rails">
<system.web>
<httpRuntime executionTimeout="3600" maxRequestLength="1048576" />
</system.web>
</location>
Если все остальное настроено правильно, это должно сделать это. Как предложил Питер Бромберг, вы можете добавить столько блоков, сколько необходимо, чтобы повысить лимиты для определенных URL-адресов.
Последнее примечание: в режиме отладки IIS не применяет настройки тайм-аута соединения или исполненияTimeout, чтобы дать вам больше времени для отладки. Поэтому, чтобы проверить настройки на машине разработчика, вы должны сделать сборку релизов, и вы должны установить параметр "Включить отладку на стороне сервера" на false
.