web-dev-qa-db-ja.com

ASP.NETでURLごとに異なるタイムアウトを設定する方法

アプリケーションの一部のURLに異なる接続制限が必要です。一部のURLはファイルのアップロードを受け入れ、大きな接続タイムアウトが必要です。他のすべてのURLは、サービス拒否を防ぎ、リソースを浪費しないために、はるかに短いタイムアウトを必要とします。

現在、IISの接続タイムアウトプロパティをサイト全体で60分に設定しています。次に、web.configでこれを行いました。

<system.web>
    <httpRuntime executionTimeout="480" maxRequestLength="1024" />
</system.web>

<location path="FileUpload/WriteFile.Rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="512000" />
    </system.web>
</location>

したがって、これによりすべてのURLが8分のタイムアウトに設定され、WriteFile.RailsURLが60分間実行されるようになることを期待していました。代わりに、すべてのURLを60分間実行できます。 IISでやりたいことを実行するにはどうすればよいですか?

18

質問は特にタイムアウトについて尋ねましたが、maxRequestLengthの設定も暗示していました。私は両方の問題に本当に包括的な答えを与えることを試みるつもりです(今私はそれを解決するのにほとんど一日を費やしました)。

ファイルのアップロードを処理する単一のURLがWebサイトにあるとします。そのURLで最大1ギガバイトのデータを取り込みたいので、クライアントは最大1時間接続できます。他のすべてのURLは、90秒の接続時間と、POST本文で最大4MB)のみを許可します。

全体設定

まず、サイト全体の時間とサイズの制限をグローバルに引き上げる必要があります。まず、サイト全体の「接続タイムアウト」を設定します。これは絶対的な上限として機能し、web.config内から設定することはできません。 IIS7のWebサイトには ここでの適切な手順 があります。 IIS7 /7.5に付属のMicrosoft.Web.Administrationlibrary を使用してプログラムで実行することもできます。

var serverManager = ServerManager.OpenRemote("\\web-server-name");
var site = serverManager.Sites["Your-Site-Name"];
site.Limits.ConnectionTimeout = new TimeSpan(1, 0, 0);

次に、サイトで許可される最大サイズのリクエストを設定する必要があります。これは、RequestFitleringモジュールのまったく別の場所にあります。このモジュールは、IIS7にデフォルトでインストールされていない可能性があります。繰り返しになりますが、MicrosoftはGUIを介してmaxAllowedContentLengthを設定する方法について 良い指示 を持っています。これは、Web.config内から設定できるものです。

<system.webServer>
    <security>
        <requestFiltering>
            <!-- Allow 1GB uploads -->
            <requestLimits maxAllowedContentLength="1073741824"></requestLimits>
        </requestFiltering>
    </security>
</system.webServer>

この設定はContent-Lengthヘッダーに対して評価され、これより大きいリクエストはすぐに404.13になります。設定はバイト単位であり、次に来るのはキロバイト単位であり、このIIS7と非常に一貫性があります。

ASP.NET設定

次に、すべてのASP.NET要求を90秒/ 4MBで制限します。これは、web.configで実行できます。

<location>
    <system.web>
        <httpRuntime executionTimeout="90" maxRequestLength="4096" />
    </system.web>
</location>

設定をグローバルにするには、system.webタグをlocation属性のないpathタグでラップします。 (元の質問では、おそらく問題の原因であるlocationタグでsystem.webタグをラップしませんでした。)maxRequestLength今回はキロバイト単位です。

最後に、特別なアップロードURLが巨大なアップロードを受け入れることを許可したいと思います。これらの値をグローバルに設定した値よりも高く設定しても機能しません。グローバル値はこれらの設定を上書きします。

<location path="Uploads/PostFile.Rails">
    <system.web>
        <httpRuntime executionTimeout="3600" maxRequestLength="1048576" />
    </system.web>
</location>

他のすべてが正しく設定されている場合は、それで十分です。 Peter Brombergが提案したように、特定のURLの制限を引き上げるために、これらのブロックを必要な数だけ追加できます。

最後の注意:デバッグモードではIISは接続タイムアウトまたはexecutionTimeout設定を強制しないため、デバッグにより多くの時間をかけることができます。したがって、開発者マシンで設定をテストするには、リリースビルドを実行する必要がありますまた、[サーバー側のデバッグを有効にする]設定をfalseに設定する必要があります。

29

コントローラーアクションでいつでも直接ScriptTimeoutを設定できます。そうすれば、ルーティングを変更しても構成が壊れることはありません。

0
jishi

特定のページのタイムアウトを設定するには、必要な数の<location pathweb.config要素を使用できます。

<location path="Myfile.aspx">
  <system.web>
    <httpRuntime executionTimeout="180"/>
  </system.web>
</location>

パスが正しく定義されていて、.Rails拡張子がASP.NETにマップされている限り、これは機能するはずです。 ASP.NET実行エンジンが* .Rails拡張機能を処理していない可能性がありますか?

注:なんてひどい投稿編集者だろう。なぜユーザーのためにエスケープできないのですか?

0
Peter Bromberg