0

Azure App ServiceでホストされているASP.NET MVC Webサイトでは、15秒以上かかるリクエストに対しては強制的にタイムアウトしたいと思っています。ここでは、デフォルトではAzure AppサービスApplicationHost.configでカスタムConnectionTimeoutを設定する

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

...でテストしてきた、常に15秒よりも長くかかるシンプルなアクション(すなわち無限ループは)私は、ブラウザでそのアクションのGETをすれば、私は」です2分後に "500 - The request timed out"エラーが発生します。これはthe "connectionTimeout" default setting in the webLimits section of ApplicationHost.configと一致します。

私が間違っていない限り、このconnectionTimeout値を15秒に変更するだけで十分です。これを行うには、hereの説明に従って、ApplicationHost.configファイル(XDT)にトランスフォームベースのアプローチを使用する必要があることを理解しています。私が正しい場所に(:/home/site/applicationHost.xdt d)にファイルを追加した後、私は次のよう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> 

...。私は、私のサイトを再起動し、正常に適用された変換ログで見た:

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秒ではなく2分後にタイムアウトします。

私の質問:なぜこのタイムアウト設定が尊重されていないのですか?

私はthis postを知っていますが、これはまったく同じアプローチをとっているようです(動作すると思われますか?)。

答えて

1

代わりにWeb.Configを使用してexecutionTimeoutを使用するのはどうですか?この設定を尊重するすべての要求をしたい場合は

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

は、あなたが作成することができます:MVCプロジェクトの

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

、あなたが値を強制するために、次のコードを追加する必要がありますが、要求に適用されますアクションフィルタ:

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

のGlobal.asaxで呼び出さRegisterGlobalFilters方法でそれを登録します:

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

ご覧ください。

+0

おかげで、はい、私もその1の意識です。また、15秒に設定されていて、違いはありません。 – sammy34

+0

私は上記の詳細を追加しました。 –

関連する問題