問題の本質
ASP.NETでは、web.configでリクエストのサイズに制限を設定できます。
<system.web> <httpRuntime maxRequestLength="1000"/>
値はキロバイトで指定され、デフォルトは4096 KBです。 明らかに、各場所に対して、独自の制限を設定できます。
注: IIS 7以降では、要求をフィルタリングするための追加機能があります。
<system.webServer> <security> <requestFiltering> <!-- --> <requestLimits maxAllowedContentLength="30000000"></requestLimits>
T.ch. これら2つのパラメーターをペアで変更する必要があります。
ASP.NETには、この制限を超える例外をキャッチして処理するための標準的な方法がありません。 最初に思い浮かぶのは、 ErrorイベントハンドラーでGlobal.asaxの例外をキャッチすることです。 しかし、これは2つの理由でコーシャーではないことが判明しました。
- 特別な種類の例外はありませんが、英語のロケールでは、一般的なSystem.Web.HttpExceptionがスローされます(もちろん、HttpUnhandledExceptionでラップされます)。 T.ch. 「クライアント」を取得する方法は保証されていません。
- 経験的に、例外がキャッチされるまでに、サーバーは既に応答の一部をクライアントに送信することができたため、Responseオブジェクトを使用することが困難になったという事実に直面しました。
解決策
解決策はここで見張られました 。 しかし、私には同志が少し賢すぎるように思えます。 私の意見では、より簡単に、より正確に判明しました。 Global.asaxでは、リクエスト処理の最初の段階で、サイズを確認し、特別に準備されたページにユーザーをリダイレクトします(存在する場合)。
public override void Init() { base.Init(); this.BeginRequest += GlobalBeginRequest; } private void GlobalBeginRequest(object sender, EventArgs e) { var runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime"); var maxRequestLength = runTime.MaxRequestLength * 1024; if (Request.ContentLength > maxRequestLength) { // Response.Redirect("~/filetoolarge/"); } }
いくつかの説明。
最初に
var runTime = (HttpRuntimeSection)WebConfigurationManager.GetSection("system.web/httpRuntime");
最初に考えたのは、このパラメーターを起動の段階でアプリケーションの個別のプロパティとして記憶することでした。 しかし、これは正しくありません、なぜなら サイト上の異なるディレクトリには、独自のパラメータがあります。
セカンドプロ
var maxRequestLength = runTime.MaxRequestLength * 1024;
元のソースが100 KBを減算しようとした理由はまだわかりませんでした。 ASP.NET制約は、フォームデータとすべての添付ファイルと共に、ASP.NET 2、.NET 3.5、IIS 6でテストされた要求全体で機能します。
これについて私が伝えたかったのはそれだけです。 そうではないが。 おそらく、クライアント検証を含む適切な方法でそれを追加する必要があります。 およびファイルサイズ。 このためには、サードパーティのコンポーネントを使用する必要があります。 ファイルをダウンロードするための組み込みのブラウザコントロール-これは別のまともなスマットです。 おそらく個々の実装は、影響を受ける問題を包括的な方法で解決することができます。