я не мог получить эту работу, установив 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"
).
Я тогда наткнулся на this link около ScriptTimeout
и executionTimeout
, не работая с аналогичной настройкой того, что вы описали. Первый ответ в сообщении описывает использование debug="false"
, а также упоминание о том, что таймаут будет иметь задержку от 5 до 15 секунд. Мне все еще не повезло, даже если вы используете большое значение Thread.Sleep
. Второй ответ в этой статье предполагает, что настройка конфигурации executionTimeout
является заменой свойства ScriptTimeout
(который, по-видимому, является интерфейсом COM, используемым в классическом ASP). Этот ответ предполагает, что невозможно установить определенный тайм-аут, не используя собственную логику тайм-аута.
Далее я натолкнулся на following (more recent) link, где первый ответ предполагает, что тайм-аут отключен в MVC. Еще один ответ предполагает, что это связано с тем, что MVCHandler
(который выбирает контроллер, который будет обрабатывать HTTPRequest
), является IHttpAsyncHandler
, и поэтому он может выполнять другой запрос (который является точкой использования запроса async), поэтому он внутренне переключает время -out state off (это то, что я собираю, прочитав эту ссылку). Он должен работать с прямым asp.net
, хотя использование ScriptTimeout
представляется приемлемым способом в this answer.
Ссылка предполагает, что добавление следующей строки позволит ему работать (но не в приложении среднего доверия):
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
, не работает.
Можете ли вы представить свою реализацию фильтра времени ожидания? –
@JalpeshVadgama Добавлено, как просили. – ProfK