0

На нашем веб-сайте ASP.NET MVC, размещенном в Azure App Service, мы хотели бы установить тайм-аут для запросов, которые занимают больше 15 секунд. Вот простое действие, которое всегда занимает больше времени, чем за 15 секунд (т.е. бесконечный цикл), который мы тестировали с ...Azure App Service Set Custom ConnectionTimeout в ApplicationHost.config

public ActionResult TimeoutTest() 
    { 
     var i = 1; 
     while (true) 
     { 
      i++; 
     } 
     return new HttpStatusCodeResult(200); 
    } 

По умолчанию, если я делаю GET на это действие в браузере, я После двух минут вы получите сообщение об ошибке «500 - время ожидания запроса», что согласуется с the "connectionTimeout" default setting in the webLimits section of ApplicationHost.config.

Итак ... если я ошибаюсь, этого должно быть достаточно, чтобы изменить это значение connectionTimeout на 15 секунд. Для этого я понимаю, что для файла ApplicationHost.config (XDT) необходимо использовать подход, основанный на преобразовании, как описано here.

Я сделал это с помощью следующего applicationHost.xdt файла ...

<?xml version="1.0"?> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
<system.applicationHost> 
     <webLimits xdt:Transform="SetAttributes(connectionTimeout)" connectionTimeout="00:00:15"/> 
</system.applicationHost> 
</configuration> 

... после чего я добавил файл в нужном месте (d: /home/site/applicationHost.xdt). Я перезагрузил мой сайт и увидел в журнале, который был успешно применен преобразующим:

2016-04-20T08:40:44 Start 'site' site extension transform 
2016-04-20T08:40:44 StartSection Executing SetAttributes (transform line 4, 18) 
2016-04-20T08:40:44 on /configuration/system.applicationHost/webLimits 
2016-04-20T08:40:44 Applying to 'webLimits' element (no source line info) 
2016-04-20T08:40:44 Set 'connectionTimeout' attribute 
2016-04-20T08:40:44 Set 1 attributes 
2016-04-20T08:40:44 EndSection Done executing SetAttributes 
2016-04-20T08:40:44 Successful 'D:\home\site\applicationHost.xdt' site extension transform 
2016-04-20T08:40:44 sandboxproc.exe complete successfully. Ellapsed = 316.00 ms 

[Изменить]: Я также проверил ApplicationHost.config непосредственно после преобразования, и новое значение есть:

... 
    </sites> 
    <webLimits connectionTimeout="00:00:15" /> 
    </system.applicationHost> 
    <system.webServer> 
    <asp> 
    ... 

Несмотря на все это, если я снова ударил свой метод действия, он все равно истекает через две минуты вместо 15 секунд.

Мой вопрос: Кто-нибудь знает, почему этот тайм-аут не соблюдается?

Я знаю this post, который выглядит так, как будто он принял тот же подход (и, похоже, работал?).

ответ

1

Как насчет использования executeTimeout вместо этого через Web.Config?

<system.web> 
    <httpRuntime executionTimeout="30" /> 
    <compilation debug="false" /> 
</system.web> 

Для проекта MVC, необходимо добавить следующий код, чтобы заставить значение, которое будет применяться к запросу:

System.Web.HttpContext.Current.GetType().GetField("_timeoutState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(System.Web.HttpContext.Current, 1); 

Если вы хотите каждый запрос уважать этот параметр, вы можете создать действие фильтра:

public class Timeoutter : ActionFilterAttribute 
{ 
    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); 
    } 
} 

Добавить зарегистрировать его в методе RegisterGlobalFilters называется в Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new Timeoutter()); 
    filters.Add(new HandleErrorAttribute()); 
} 

Пожалуйста, см:

+0

Спасибо, да, я знаю, что один тоже. Он также установлен на 15 секунд и, похоже, не имеет значения. – sammy34

+0

Я добавил более подробно выше. –