Как установить различные тайм-ауты для разных URL-адресов в ASP.NET

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

В настоящее время у меня есть свойство тайм-аута соединения в IIS для всего сайта на 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 делать то, что я хочу?

Ответы

Ответ 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.

Ответ 2

Чтобы установить тайм-аут для определенной страницы, вы можете использовать как можно больше элементов web.config пути lt; location:

< location path = "Myfile.aspx" >       < system.web >               < httpRuntime executionTimeout = "180" / >       & Л; /system.web > </местоположение >

Пока ваш путь определен правильно, а расширение .rails сопоставляется с ASP.NET, это должно работать. Может ли быть, что механизм выполнения ASP.NET не обрабатывает расширения *.rails?

Примечание: Человек, какой паршивый редактор сообщений. Почему вы не можете выполнить эвакуацию для пользователя?

Ответ 3

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