none
リクエストタイムアウト時間(executionTimeout)の設定 RRS feed

  • 質問

  • IIS7.5 / ASP.NET 3.5 で Webアプリケーションを開発しています。

    データベース中のレコードを全件CSV出力するページがあり、これがASP.NETのタイムアウト時間を超えてしまうことがあるため設定を変える必要が出てきました。その変更方法について質問なのですが、

    1.コード中から動的に変更することができるようにmsdnには記載されています。 http://msdn.microsoft.com/ja-jp/library/system.web.configuration.httpruntimesection.executiontimeout(VS.80).aspx そこでPage_Loadの中で次のようにコードしたところ

    HttpRuntimeSection runtimeSection = HttpContext.Current.GetSection("system.web/httpRuntime") as HttpRuntimeSection;
    if (runtimeSection != null) runtimeSection.ExecutionTimeout = TimeSpan.FromSeconds(500);
    
    

    実行時に「読み取り専用のプロパティです」という例外が出てしまいました。書き込めない理由はなぜでしょうか?

     

    2.Web.config中で configuration/location/system.web/httpRuntime に executionTimeout属性を設定する方法を試したところ、設定時間通りに動きません。1秒と設定したのに15秒前後、15秒と設定したのに40秒前後でタイムアウトしています。

    これは、設定時間より早くタイムアウトすることはない、という仕様だと理解していいのでしょうか?

    2010年10月14日 2:25

回答

  • 1つ目はわかりませんでした。

    私の方では、「構成は読み取り専用です。」という System.Configuration.ConfigurationErrorsException になりました。
    プロパティとしては読み書きできるように設計されていても、IsReadOnly() は true を返すので、このセクションの内容は変更できないんだと思います。理由はわかりませんけど。

    2つ目は以下に書かれていました。

    How the Execution Timeout is managed in ASP.NET
    http://blogs.msdn.com/b/pedram/archive/2007/10/02/how-the-execution-timeout-is-managed-in-asp-net.aspx

    15秒単位で Timeout しているかどうかがチェックされるからだそうです。

    私のところでは15秒を指定すると20秒ぐらいでタイムアウトしました。タイミングによっては30秒になる場合もあることになりますが、40秒はちょっと多いですね。もう一度試されてもそうなりますか?

    • 回答としてマーク miuras_net 2010年10月15日 0:25
    2010年10月14日 6:00
  • 以下のサイトでマイクロソフトの人が、実行時(リクエスト発生後)には変更できないと書かれていました。

    http://www.velocityreviews.com/forums/t75299-executiontimeout.html

    • 回答としてマーク miuras_net 2010年10月15日 0:25
    2010年10月14日 7:05

すべての返信

  • 1つ目はわかりませんでした。

    私の方では、「構成は読み取り専用です。」という System.Configuration.ConfigurationErrorsException になりました。
    プロパティとしては読み書きできるように設計されていても、IsReadOnly() は true を返すので、このセクションの内容は変更できないんだと思います。理由はわかりませんけど。

    2つ目は以下に書かれていました。

    How the Execution Timeout is managed in ASP.NET
    http://blogs.msdn.com/b/pedram/archive/2007/10/02/how-the-execution-timeout-is-managed-in-asp-net.aspx

    15秒単位で Timeout しているかどうかがチェックされるからだそうです。

    私のところでは15秒を指定すると20秒ぐらいでタイムアウトしました。タイミングによっては30秒になる場合もあることになりますが、40秒はちょっと多いですね。もう一度試されてもそうなりますか?

    • 回答としてマーク miuras_net 2010年10月15日 0:25
    2010年10月14日 6:00
  • TH01さんありがとうございます。確かに40秒は説明つかないですね…ここは見直してみます。とはいえほぼ、2.の疑問は解決しました。

    2010年10月14日 6:32
  • 以下のサイトでマイクロソフトの人が、実行時(リクエスト発生後)には変更できないと書かれていました。

    http://www.velocityreviews.com/forums/t75299-executiontimeout.html

    • 回答としてマーク miuras_net 2010年10月15日 0:25
    2010年10月14日 7:05
  • タイムアウトは単に伸ばせばいいものでもありません。待ちきれなくなったユーザーがリロードを押せばさらに負荷が高くなってしまいます。

    処理に問題がないか見直すべきでしょう。また、本当にそれほどの時間がかかる処理なら、リクエストとは別のところでCSVを生成し、即応答できるようにするのも一つの手です。

    2010年10月14日 10:12
  • 掘り下げての調査ありがとうございます。変更できないのが仕様なのですね。

    PHPのようなスクリプト言語なら set_time_limit(300); と一行書くだけでできてしまうことなので、動的に変更できて当然と思っていました。msdnのあのサンプルコードは何だったんでしょうね。

    2010年10月15日 0:23
  • アドバイスありがとうございます。

    お察しの通り処理に問題がありますので、永続化層とのインターフェースまで含めた大改修が予定されています。それまでの応急処置が必要で今回質問させていただいた次第でした。

    2010年10月15日 0:25