Вопрос, заданный специально о тайм-аутах, но также подразумевал настройку maxRequestLength. Я попытаюсь дать действительно исчерпывающий ответ на оба вопроса (теперь, когда я потратил большую часть дня на его решение).
Допустим, у нас есть один URL на нашем сайте, который мы хотим обрабатывать загрузки файлов. Мы хотим получить до гигабайта данных по этому 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);
Далее вам нужно установить максимальный размер запроса, который разрешает сайт. Это в совершенно другом месте, в модуле «Подгонка запросов». Этот модуль не может быть установлен по умолчанию на IIS7. Снова у Microsoft есть хорошие инструкции о том, как установить maxAllowedContentLength
через графический интерфейс. Это то, что вы можете установить из Web.config:
<system.webServer>
<security>
<requestFiltering>
<!-- Allow 1GB uploads -->
<requestLimits maxAllowedContentLength="1073741824"></requestLimits>
</requestFiltering>
</security>
</system.webServer>
Этот параметр оценивается по заголовку Content-Length
, и запросы большего размера немедленно приведут к 404.13. Параметр задается в байтах, а далее - в килобайтах, что соответствует 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 не применяет параметры «Время ожидания подключения» или «время выполнения», чтобы предоставить вам больше времени для отладки. Поэтому, чтобы протестировать настройки на компьютере разработчика, вы должны выполнить сборку релиза и установить для параметра «Включить отладку на стороне сервера» значение false
.