Ответ 1
Я не мог заставить это работать, установив свойство ScriptTimeout
, даже если установить debug="false"
в web.config
, как было предложено пользователем Erik Funkenbusch:
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.5"/>
...
Он продолжал возвращать текст "Это никогда не возвращался", а не тайминг во время Thread.Sleep
.
Также стоит отметить, что я также расширил Thread.Sleep
до уровня Server.ScriptTimeout
по умолчанию 110 секунд, но он все же в конечном итоге вернул тот же текст, а не тайминг.
Вместо этого я попытался установить executionTimeout
в web.config
:
<configuration>
<system.web>
<httpRuntime targetFramework="4.5" executionTimeout="5"/>
...
Если вы должны добавить точку останова в TimeoutFilter
, вы заметите, что значение ScriptTimeout
установлено в значение executionTimeout
из web.config
. Увы, это все еще не сработало для меня (независимо от того, debug="false"
).
Затем я наткнулся на эту ссылку о ScriptTimeout
и executionTimeout
, не работающем с аналогичной настройкой с тем, что вы описываете. Первый ответ в сообщении описывает использование debug="false"
, а также упоминание о том, что таймаут будет иметь задержку от 5 до 15 секунд. Мне все еще не повезло, даже когда вы используете большое значение Thread.Sleep
. Второй ответ в этой статье предполагает, что параметр конфигурации executionTimeout
является заменой свойства ScriptTimeout
(который, по-видимому, является интерфейсом COM, используемым в классическом ASP). Этот ответ предполагает, что невозможно установить определенный тайм-аут без использования собственной логики тайм-аута.
Далее я наткнулся на следующую (более позднюю) ссылку, где первый ответ предполагает, что тайм-аут отключен в MVC. Еще один ответ предполагает, что это связано с тем, что MVCHandler
(который выбирает контроллер, который будет обрабатывать HTTPRequest
), это IHttpAsyncHandler
и поэтому он может выполнять другой запрос (который является точкой использования асинхронного запроса), поэтому он внутренне отключает состояние тайм-аута (это то, что я получаю от чтения этой ссылки). Он должен работать с прямым asp.net
, хотя использование ScriptTimeout
кажется приемлемым способом в этом ответе.
Ссылка предполагает, что добавление следующей строки позволит ей работать (но не в средстве доверия):
System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);
Поэтому, изменив TimeoutFilter
OnActionExecuting()
на:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1);
base.OnActionExecuting(filterContext);
}
и установите web.config
:
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.5"/>
<httpRuntime targetFramework="4.5" executionTimeout="5"/>
...
позволяет тайм-ауту работать, но имеет небольшую задержку в 5 секунд, указанную в первом сообщении.
Примечание. Использование этого метода не позволяет вам установить свойство ScriptTimeout
в фильтре. Попытка установить ScriptTimeout
и переопределить значение, установленное в web.config
, не работает.