0

Auf unserer ASP.NET MVC-Website im Azure App Service möchten wir eine Zeitüberschreitung für Anforderungen erzwingen, die länger als 15 Sekunden dauern. Hier ist eine einfache Aktion, die immer länger dauert als 15 Sekunden (dh Endlosschleife), die wir mit dem Testen haben ...Azure-App-Service Festlegen von benutzerdefiniertem ConnectionTimeout in ApplicationHost.config

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

standardmäßig, wenn ich auf dieser Aktion in einem Browser ein GET tun, ich lch bekomme nach zwei Minuten einen Fehler "500 - Die Anfrage ist abgelaufen", was mit the "connectionTimeout" default setting in the webLimits section of ApplicationHost.config übereinstimmt.

Also ... wenn ich mich nicht irre, sollte es ausreichen, um diesen ConnectionTimeout Wert auf 15 Sekunden zu ändern. Um dies zu tun, muss man einen transformationsbasierten Ansatz für die Datei ApplicationHost.config (XDT) verwenden, wie in here erläutert.

Ich tue dies mit der folgenden applicationHost.xdt Datei ...

<?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> 

... nach dem ich die Datei in der richtigen Stelle hinzugefügt (d: /home/site/applicationHost.xdt). Ich neu gestartet meine Seite und sah in den Protokollen, die die erfolgreich angewandt Transformation wurde:

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 

[Bearbeiten]: Ich habe überprüft auch die applicationhost.config direkt nach der Transformation, und der neue Wert ist da:

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

Trotz alledem, wenn ich meine Aktionsmethode oben erneut treffe, wird die Zeit nach zwei Minuten anstatt nach 15 Sekunden immer noch überschritten.

Meine Frage: Weiß jemand, warum diese Timeout-Einstellung nicht eingehalten wird?

Ich bin bewusst, this post, die aussieht, als ob es genau den gleichen Ansatz (und schien zu funktionieren?).

Antwort

1

Was ist mit der Verwendung von executionTimeout stattdessen über die Web.Config?

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

Für ein MVC-Projekt, sollten Sie den folgenden Code hinzufügen, um den Wert zu zwingen, auf die Anfrage angewendet werden:

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

Wenn Sie jede Anfrage wollen diese Einstellung respektieren, können Sie eine erstellen Action-Filter:

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); 
    } 
} 

hinzufügen es in der RegisterGlobalFilters Methode in der Global.asax genannt registrieren:

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

Bitte sehen:

+0

Danke, ja, ich bin zu diesen eine bewusst. Es ist auch auf 15 Sekunden eingestellt und scheint auch keinen Unterschied zu machen. – sammy34

+0

Ich habe oben weitere Details hinzugefügt. –