Как установить разные таймауты для разных URL в ASP.NET - PullRequest
18 голосов
/ 17 июня 2011

Я хочу установить разные ограничения на соединение для некоторых URL в моем приложении. Некоторые URL допускают загрузку файлов и должны иметь большой тайм-аут соединения. Для всех остальных URL-адресов требуется намного меньшее время ожидания, чтобы предотвратить отказ в обслуживании и не тратить ресурсы.

В настоящее время в IIS свойство Connection Timeout установлено для всего сайта на 60 минут. Затем я сделал это в web.config:

<system.web>
    <httpRuntime executionTimeout="480" maxRequestLength="1024" />
</system.web>

<location path="FileUpload/WriteFile.rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="512000" />
    </system.web>
</location>

Так что я надеялся, что это установит для всех URL-адресов 8-минутный тайм-аут и позволит URL-адресу WriteFile.rails работать в течение 60 минут. Вместо этого ВСЕ URL-адреса могут работать в течение 60 минут. Как заставить IIS делать то, что я хочу?

Ответы [ 3 ]

29 голосов
/ 06 июля 2011

Вопрос, заданный специально о тайм-аутах, но также подразумевал настройку 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.

0 голосов
/ 20 июня 2011

Вы всегда можете установить ScriptTimeout прямо в действии вашего контроллера.Таким образом, конфигурация не будет нарушена, если вы измените маршрут.

0 голосов
/ 17 июня 2011

Чтобы установить тайм-аут для конкретной страницы, вы можете использовать как можно больше

...