アプリケーションはOnErrorにエラーを記録できますが、ユーザーにとって意味のあるものを表示するためのリダイレクトなどを行うことはできません。何か案は?web.configでmaxRequestLengthを設定できることは知っていますが、とにかくユーザーはこの制限を超える可能性があり、通常のエラーを表示する必要があります。
6 に答える
あなたが言うように、web.config で maxRequestLength を設定できます (machine.config のデフォルトの 4MB をオーバーライドします)。この制限を超えると、通常は HTTP 401.1 エラーが発生します。
アプリケーション レベルで一般的な HTTP エラーを処理するには、web.config の system.web セクション内に CustomError セクションを設定します。
<system.web>
<customErrors mode=On defaultRedirect=yourCustomErrorPage.aspx />
</system.web>
エラーが表示されるたびに、ユーザーはカスタム エラー ページにリダイレクトされます。
エラーごとに特化したページが必要な場合は、次のようにすることができます。
<system.web>
<customErrors mode="On" defaultRedirect="yourCustomErrorPage.aspx">
<error statusCode="404" redirect="PageNotFound.aspx" />
</customErrors>
</system.web>
等々。
または、IIS から仮想ディレクトリ プロパティの CustomErrors タブを編集して、選択したエラー処理ページを指すようにすることもできます。
上記は 401.x エラーでは機能しないようです。このコード プロジェクトの記事では、非常によく似た問題の回避策について説明しています:カスタム 401 ページへのリダイレクト
残念ながら、IIS6 はファイルのサイズを確認できる段階に到達しないため、おそらく IIS7 が必要であり、カスタム ハンドラーでこれをキャッチすることになります。アップロードが完了したとき、またはエラーが発生したときにのみ、サイズを知ることができます。
これは、ASP.NET の既知の問題です。もう 1 つの (不十分な) 代替案は、リクエストの早い段階でこれを処理し、おそらくフラッシュベースのアップローダーを使用することです。ジョンは以下のリンクのいくつかにリンクしています。
更新: Jon Galloway はこの問題を詳しく調査したようで、IIS は常にファイルを飲み込み、サイズが大きすぎると通知する必要があるため、RIA アップローダーが唯一の賢明な代替手段のようです。
セルゲイ
JohnIdol の回答によると、413ステータスコードのカスタム エラー ページを設定する必要があります。例えば:
<customErrors mode="On" defaultRedirect="~/Errors/Error.aspx">
<error statusCode="413" redirect="~/Errors/UploadError.aspx"/>
</customErrors>
私はクライアント プロジェクトで同じ問題を解決しなければならなかったので、これは私にとってはうまくいった解決策でした。残念ながら、それが私が見つけた唯一の解決策でした...この特定の問題をコードでキャッチすることはできませんでした。たとえば、snomag が提案したように投稿されたファイルの長さを確認したり、global.asax でエラーをキャッチしたりします。あなたと同じように、実用的な解決策を思いつく前に、これらの他のアプローチも試しました。(実際、問題に取り組んでいるときに、最終的にウェブ上のどこかでこれを見つけました)。
それが役立つことを願っています。
大規模なアップロードを処理する最善の方法は、ファイルをチャンクに分割する HttpModule を実装するソリューションを使用することです。そこにある事前展開されたソリューションのいずれかで、ファイルサイズを制限できるはずです. 他の多くの人がこのページへのリンクを投稿しているので、気にしません。ただし、それを気にしたくない場合は、アプリの Global.asax Application_Error イベントでこれを処理できます。アプリケーションが .NET 4.0 の場合は、次のコード ブロックを挿入します。
if (ex.InnerException != null && ex.InnerException.GetType() == typeof(HttpException) && ((HttpException)ex.InnerException).WebEventCode == System.Web.Management.WebEventCodes.RuntimeErrorPostTooLarge)
{
//Handle and redirect here, you can use Server.ClearError() and Response.Redirect("FileTooBig.aspx") or whatever you choose
}
以前のフレームワークで実行している場合は、次のコードを試してください (VB ですが、翻訳は簡単です): http://www.webdeveloper.com/forum/showthread.php?t=52132
Global.asax - OnError() ハンドラーでエラーをキャッチできるはずです。残念ながら、最初のリクエストは終了し、同じアップロード ページをレンダリングして、ユーザーに何らかのエラー通知を表示することはできません。
せいぜいできることは、OnError() ハンドラー内から単純なリダイレクト句を含むわかりやすいエラー ページを表示し、そのページにバック リンクまたは同様の機能を持たせて、ユーザーが最初にエラーをトリガーしたページにユーザーを戻すことです。場所。
アップデート:
最近、ファイルのアップロード時に正確なチェックを実装する必要がありました。思いついたのは、要件を完全に満たし、多くの追加機能を備えたSWFUploadライブラリです。Steve Sanderson が提供する jquery ラッパーと一緒に使用しました。詳細については、こちらをご覧ください。
ポイントは、フラッシュがクライアント側でファイルサイズを検出し、このケースが満たされた場合に適切に反応できることです。そして、これはまさにあなたが必要としているものだと思います。
さらに、クライアントにフラッシュがインストールされていない場合に、ネイティブ アップロード ボタン 0 に正常に低下させたい場合は、フラッシュ検出チェックを実装できます。
投稿されたファイルの長さ(FileUpload.PostedFile.ContentLength)をチェックして、制限を下回っているかどうかを確認し、必要に応じてわかりやすいエラーメッセージを表示することができます。