WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

WCF と executionTimeout

by WebSurfer 18. June 2016 13:23

ASP.NET でホストされていても、WCF サービスを要求した場合は httpRuntime 要素の executionTimeout 属性の設定は効かない(タイムアウトしない)という話を書きます。

元は MSDN Forum の「webconfig 内の executionTimeout 値が有効にならない」という表題のスレッドでの話です。

MSDN Forum での話では、非同期ではないのかとか ASP.NET 互換モードの設定がされてないのではとかいろいろ紆余曲折ありましたが、結局一番の原因は:

ASP.NET でホストされていても、.NET 3.0 SP1 以降 WCF サービスを要求した場合は executionTimeout が Int32.MaxValue に設定される

・・・ということだと分かりました。

ググって見つけた記事「All WCF timeouts explained」にそれが書いてありました。記事の一番下に "Nowadays (.NET 3.0 SP1 and later) there is no more to say. The ExecutionTimeout is set to int.MaxValue for WCF requests. Thereby WCF is granted full control over its own request lifetimes." という記述があります。

上記の記事を裏付ける Microsoft の公式文書は見つかっていませんが、実際に検証してタイムアウトしないことやHttpServerUtility.ScriptTimeout プロパティ設定値を調べた結果から、間違いないようです。

MSDN Blog の記事(例えば「Timeouts in WCF and their default values」)などによると、WCF サービスでも ASP.NET でホストされていれば executionTimeout 属性の設定は有効というようなことが書いてあって惑わされましたが、それは .NET 3.0 SP1 適用前の話だったようです。

主な話は以上ですが、これを調べる過程でタイムアウトや WCF に関することがいろいろわかったので、忘れないように以下にまとめて書いておきます。

  1. WCF サービスでは executionTimeout 属性の設定は効かない
    WCF サービスを要求した場合は executionTimeout が Int32.MaxValue に設定されます。ScriptTimeout プロパティの値で確認すると、compilation debug="false" / "true" の設定に関わらず Int32.MaxValue 即ち 2147483647 になることが確認できます。
  2. タイムアウトのチェックは 15 秒毎
    MSDN Blog の記事「How the Execution Timeout is managed in ASP.NET」によると、タイムアウトは System.Threading.Timer によって 15 秒毎に発生するイベントでチェックしているとのことです。従って、普通の .aspx ページなど executionTimeout が有効な場合でも、設定された時間で正確にタイムアウトすることはないです。
  3. 非同期ではタイムアウトさせられない
    ASP.NET の非同期というのは MSDN の記事「ASP.NET の非同期/待機の概要」に書いてあることですが、その記事の図3にあるように、「外部リソースを非同期に待機中」はスレッドプールにスレッドが戻されます。一方、上記 2 で紹介した MSDN Blog の記事に書かれていますように、タイムアウトはスレッドを Abort することで行われるそうです。ということは、非同期の場合はタイムアウトさせるスレッドが存在しない(=タイムアウトさせられない)ということになります。.NET 4.5 では async / await が使えるようになって、Visual Studio でコードを生成する際に自動的に非同期になるようですが、その場合は executionTimeout が有効にならないと思います。(未検証です)
  4. WCF サービスには非同期 HTTP ハンドラを利用できる
    MSDN Blog の記事「Orcas SP1 Improvement: Asynchronous WCF HTTP Module/Handler for IIS7 for Better Server Scalability」によると、.NET 3.5 SP1 から非同期版ハンドラが利用できるようになったそうです。自分の開発マシン (Vista SP2 32-bit, IIS7) を調べてみると、記事に書いてある通りの同期版・非同期版両方のハンドラが存在してました。記事によるとデフォルトでは同期版を使うそうです。しかし、自分の環境でHttpContext.Handler プロパティを使って調べた限りでは非同期版が使われていました。MSDN Blog の記事と矛盾する理由は不明です。
  5. debag="true" の場合の executionTimeout
    MSDN ライブラリの executionTimeout 属性の説明には "このタイムアウトは、compilation 要素のデバッグ属性が False の場合だけ適用されます" と書いてありますが、普通の .aspx ページを呼び出したとき compilation debug="true" では、ScriptTimeout プロパティの値で確認すると 30000000 になります。(WCF サービスを呼び出したときは、debug="false" / "true" に関わらず、ScriptTimeout プロパティの値は Int32.MaxValue 即ち 2147483647 になります)

Tags: ,

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  September 2019  >>
MoTuWeThFrSaSu
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

View posts in large calendar