web-dev-qa-db-ja.com

ASP.NET MVCでファイルのアップロードが許可されたサイズを超えたときにカスタムエラーページを表示する

私の主な問題は、アップロードされたファイルが許可されたサイズ(web.configのmaxRequestLength)を超えたときにカスタムエラーページを表示することです。

大きなファイルがアップロードされると、コントローラーのアップロードアクションメソッドが呼び出される前にHttpExceptionがスローされます。これは予想されることです。

カスタム属性で例外をキャッチし、コントローラーでOnExceptionをオーバーライドしようとしました。属性またはOnExceptionメソッドのいずれかで例外をキャッチできないのはなぜですか?

ただし、global.asaxのApplication_Errorで例外をキャッチすることは可能ですが、Response.RedirectもServer.Transferもカスタムエラーページへのリダイレクトには機能しません。 Server.Transferは「子リクエストの処理に失敗しました」エラーを示し、response.redirectは「送信済みのHTTPヘッダー」エラーを示します。

何か案は?

前もって感謝します!

マーカス

42
Marcus

IIS7以降で実行する場合、別のパラメーターがあります。

_<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="10485760" />
    </requestFiltering>
  </security>
</system.webServer>
_

デフォルトの設定は30 MB弱です。

maxRequestLengthmaxAllowedContentLengthの間のサイズのアップロードされたファイルの場合、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でmaxAllowedContentLengthmaxRequestLengthよりも小さい値を設定し、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>
_
60
Marcus

IIS6で実行する場合、BeginRequestを処理してHttpModuleで解決し、httpApplication.Context.Request.LengthがmaxRequestLengthより大きいかどうかを確認しました。

リクエスト全体をリダイレクトできるようにするには、リダイレクトする前に読み取る必要があります。

このリンクのコード例を参照してください: http://www.velocityreviews.com/forums/t97027-how-to-handle-maximum-request-length-exceeded-exception.html

3
Marcus

速度の評価リンクは、問題の解決に非常に役立ちました。述べたように、唯一の欠点は、リダイレクトを行う前にリクエスト全体(およびファイル)を読み取る必要があることです。

しかし、このように読み込まれることにより、ファイルアップロードコントロールが存在するページが実行されたときにのみ実行するように制限することができます

if (HttpContext.Current.Request.Url.ToString().Contains("UploadedPage.aspx") 
{
    //read and process page request
}
1
user455406

これを行うカスタムHttpHandlerを作成する必要があります。 ASP.NETは、アップロードサイズが大きすぎる場合(ご存知のとおり)、接続を自動的に強制終了します。

0
Tejs