Как установить тайм-аут запроса для одного действия контроллера в приложении asp.net mvc

94

Я хочу увеличить время ожидания запроса для определенного действия контроллера в моем приложении. Я знаю, что могу сделать это в web.config для всего приложения, но я бы предпочел изменить его только для этого действия.

Пример Web.config:

<system.web>
  <httpRuntime executionTimeout="1000" /> 
</system.web>

Как мне это сделать?

Кайл Уэст
источник
возможный дубликат ASP.NET MVC и httpRuntime executionTimeout
balexandre

Ответы:

130

Вы можете установить это программно в контроллере: -

HttpContext.Current.Server.ScriptTimeout = 300;

Устанавливает тайм-аут 5 минут вместо 110 секунд по умолчанию (что за странное по умолчанию?)

ЭнтониУДжонс
источник
31
С появлением AsyncController стоит помнить, что для получения аналогичного эффекта для асинхронных запросов следует использовать свойство [AsyncTimeout].
Джейсон
6
Мой вопрос с этим ответом: как он действительно повлияет только на одно действие, в которое он был помещен? Итак, после выполнения запроса эта настройка будет возвращена для всех будущих запросов?
jhilden
10
@jhilden HttpContext создается для каждого запроса, поэтому он вернется к значению по умолчанию при следующем запросе
tobiak777
6
Вы можете добавить HttpContext.Current ('Current' отсутствует)
bboyle1234
5
Я получаю: «httpcontext не содержит определения для тока». Я использую .NET Core 2.0. Есть идеи, как это исправить?
Тадей
71
<location path="ControllerName/ActionName">
    <system.web>
        <httpRuntime executionTimeout="1000"/>
    </system.web>
</location>

Возможно, такие значения лучше задавать в web.config, а не в контроллере. Жесткое кодирование настраиваемых параметров считается вредным.

Войтек Трелак
источник
15
-1 Жесткое кодирование подходит для особых обстоятельств, как описано в OP. Похоже, что для определенного действия требуется другой тайм-аут, чем для остальных действий, поэтому жесткое кодирование внутри действия звучит как хорошее место.
Левитикон
6
executeTimeout не работает для MVC - это неправильный ответ. см. здесь: forum.asp.net/p/1715081/…
jfren484
3
обратите внимание, что это игнорируется как завершенное, если режим отладки установлен на msdn.microsoft.com/en-us/library/vstudio/… executionTimeout Дополнительный атрибут Int32. Задает максимальное количество секунд, в течение которых запрос может быть выполнен перед автоматическим завершением работы ASP.NET. Этот тайм-аут применяется, только если атрибут отладки в элементе компиляции имеет значение False. Следовательно, если атрибут отладки имеет значение True, вам не нужно устанавливать для этого атрибута большое значение, чтобы избежать завершения работы приложения во время отладки.
Ник ван Эш,
4
Это не самый правильный ответ, потому что у него есть побочный эффект изменения тайм-аута выполнения для всех других действий контроллера.
Эрик Дж.
1
@EricJ. только в пределах Маршрутов Контроллера, которые начинаются сControllerName\ActionName
GoldBishop
20

Мне пришлось добавить «Текущий» с помощью .NET 4.5:

HttpContext.Current.Server.ScriptTimeout = 300;
Патрик Михалина
источник