私の主な問題は、アップロードされたファイルが許可されたサイズ(web.configのmaxRequestLength)を超えたときにカスタムエラーページを表示することです。
大きなファイルがアップロードされると、コントローラーのアップロードアクションメソッドが呼び出される前にHttpExceptionがスローされます。これは予想されることです。
カスタム属性で例外をキャッチし、コントローラーでOnExceptionをオーバーライドしようとしました。属性またはOnExceptionメソッドのいずれかで例外をキャッチできないのはなぜですか?
ただし、global.asaxのApplication_Errorで例外をキャッチすることは可能ですが、Response.RedirectもServer.Transferもカスタムエラーページへのリダイレクトには機能しません。 Server.Transferは「子リクエストの処理に失敗しました」エラーを示し、response.redirectは「送信済みのHTTPヘッダー」エラーを示します。
何か案は?
前もって感謝します!
マーカス
IIS7以降で実行する場合、別のパラメーターがあります。
_<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="10485760" />
</requestFiltering>
</security>
</system.webServer>
_
デフォルトの設定は30 MB弱です。
maxRequestLength
とmaxAllowedContentLength
の間のサイズのアップロードされたファイルの場合、IIS7はHTTPコード500およびメッセージテキスト_Maximum request length exceeded
_でHttpException
をスローします。この例外がスローされると、IIS7は接続をすぐに強制終了します。したがって、このエラーでリダイレクトするHttpModule
は、global.asaxのServer.ClearError()
でHttpException
が(Application_Error()
を使用して)処理およびクリアされた場合にのみ機能します.cs。
アップロードされたファイルのサイズがmaxAllowedContentLength
より大きい場合、IIS7はエラーコード404およびsubStatusCode
13の詳細なエラーページを表示します。エラーページはC:\ inetpub\custerr\en-USにあります\ 404-13.htm
IIS7でのこのエラーのリダイレクトについては、代わりにhttpErrors
にリダイレクトすることをお勧めします。別のアクションにリダイレクトするには、web.configでmaxAllowedContentLength
にmaxRequestLength
よりも小さい値を設定し、web.configに以下を追加します。
_<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="13" />
<error statusCode="404" subStatusCode="13" prefixLanguageFilePath=""
path="http://yoursite.com/Error/UploadTooLarge" responseMode="Redirect" />
</httpErrors>
</system.webServer>
_
IIS6で実行する場合、BeginRequestを処理してHttpModuleで解決し、httpApplication.Context.Request.LengthがmaxRequestLengthより大きいかどうかを確認しました。
リクエスト全体をリダイレクトできるようにするには、リダイレクトする前に読み取る必要があります。
このリンクのコード例を参照してください: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html
速度の評価リンクは、問題の解決に非常に役立ちました。述べたように、唯一の欠点は、リダイレクトを行う前にリクエスト全体(およびファイル)を読み取る必要があることです。
しかし、このように読み込まれることにより、ファイルアップロードコントロールが存在するページが実行されたときにのみ実行するように制限することができます
if (HttpContext.Current.Request.Url.ToString().Contains("UploadedPage.aspx")
{
//read and process page request
}
これを行うカスタムHttpHandlerを作成する必要があります。 ASP.NETは、アップロードサイズが大きすぎる場合(ご存知のとおり)、接続を自動的に強制終了します。