ASP.NETで異なるURLの異なるタイムアウトを設定する方法
-
28-10-2019 - |
質問
アプリケーションの一部の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.rails URLを60分間実行できるようにすることを望んでいました。代わりに、すべてのURLを60分間実行できます。 IISに自分が欲しいことをさせるにはどうすればよいですか?
解決
この質問は、タイムアウトについて具体的に尋ねましたが、MaxRequestlengthの設定も暗示しています。私は両方の問題に対して本当に包括的な答えを出そうとします(今、私はそれを働かせて一日のほとんどを費やしました)。
ファイルのアップロードを処理したいという単一のURLがWebサイトにあるとしましょう。そのURL上のギガバイトのデータを最大に取り入れたいと考えており、クライアントがせいぜい1時間接続できるようにします。他のすべてのURLは、ポストボディに90秒の接続時間と最大4MBを許可したいと考えています。
全体設定
まず、サイト全体の時間とサイズの制限をグローバルに引き上げる必要があります。まず、サイト全体の「接続タイムアウト」を設定します。これは絶対的な上限として機能し、web.config内から設定することはできません。 IIS7 Webサイトにはあります ここに良い指示があります. 。また、プログラムで行うこともできます Microsoft.Web.Administration
図書館 IIS7/7.5が出荷されました:
var serverManager = ServerManager.OpenRemote("\\web-server-name");
var site = serverManager.Sites["Your-Site-Name"];
site.Limits.ConnectionTimeout = new TimeSpan(1, 0, 0);
次に、サイトが許可する最大サイズのリクエストを設定する必要があります。これは、リクエストフィットレリングモジュールのまったく異なる場所にあります。このモジュールは、デフォルトでIIS7にインストールされない場合があります。繰り返しますが、Microsoftは持っています 良い指示 設定する方法については maxAllowedContentLength
GUIを通して。これは、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
タグはaに包まれています location
ないタグ path
属性。 (元の質問では、おそらく私の問題の原因であったロケーションタグにsystem.webタグをラップしませんでした。) maxRequestLength
今回はkilobytesにあります。
最後に、特別なアップロードURLが巨大なアップロードを受け入れるようにしたいと考えています。これらの値をグローバルに設定した値よりも高く設定することはできません。グローバルな値は、これらの設定をオーバーライドします。
<location path="Uploads/PostFile.rails">
<system.web>
<httpRuntime executionTimeout="3600" maxRequestLength="1048576" />
</system.web>
</location>
他のすべてが正しく設定されている場合、それはそれをするはずです。 Peter Brombergが示唆したように、特定のURLの制限を上げるために、必要な数のブロックを必要な数のブロックを追加できます。
最後の注:デバッグモードでは、IISは接続タイムアウトまたはexecutionTimeoutの設定を強制せず、デバッグの時間を増やすことができます。そのため、開発者マシンで設定をテストするには、リリースビルドを実行する必要があります。 false
.
他のヒント
ScriptTimeAutを常にコントローラーアクションに直接設定できます。そうすれば、ルーティングを変更しても構成が壊れません。
特定のページのタイムアウトを設定するには、できるだけ多く使用できます
<location path="Myfile.aspx">
<system.web>
<httpRuntime executionTimeout="180"/>
</system.web>
</location>
パスが正しく定義され、.rails拡張がASP.NETにマッピングされている限り、これは機能するはずです。 ASP.NET実行エンジンが処理されていない *.Rails拡張機能?
注:なんてお粗末なポストエディター。なぜユーザーのために逃げることができないのですか?