1

Azure App Service でホストされている ASP.NET MVC Web サイトでは、15 秒以上かかる要求に対して強制的にタイムアウトを設定したいと考えています。これは、私たちがテストしてきた、常に 15 秒以上かかる単純なアクション (つまり、無限ループ) です...

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

デフォルトでは、ブラウザーでそのアクションに対して GET を実行すると、2 分後に「500 - 要求がタイムアウトしました」というエラーが表示されます。これは、ApplicationHost.config の webLimits セクションの「connectionTimeout」デフォルト設定と一致します。 .

だから...私が間違っていない限り、このconnectionTimeout値を15秒に変更するだけで十分です。これを行うには、ここで説明されているように、ApplicationHost.config ファイル (XDT) に変換ベースのアプローチを使用する必要があることを理解しています。

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

私の質問:このタイムアウト設定が尊重されていない理由を誰か知っていますか?

私はこの投稿を知っていますが、これはまったく同じアプローチを取っているようです (そしてうまくいったように見えますか?)。

4

1 に答える 1

2

代わりに、Web.Config を介して executionTimeout を使用するのはどうですか?

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

Global.asax で呼び出される RegisterGlobalFilters メソッドに登録を追加します。

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

参照してください:

于 2016-04-20T17:15:58.133 に答える