[解決済み] [Solved] ASP.NET MVCで404を適切に処理するには?
2022-04-16 01:47:30
質問
RC2を使用しています。
URLルーティングを使用する。
routes.MapRoute(
"Error",
"{*url}",
new { controller = "Errors", action = "NotFound" } // 404s
);
上記は、次のようなリクエストを処理するようです(最初のMVCプロジェクトで設定されたデフォルトのルートテーブルを想定しています): "/blah/blah/blah"
コントローラ本体でHandleUnknownAction()をオーバーライドします。
// 404s - handle here (bad action requested
protected override void HandleUnknownAction(string actionName) {
ViewData["actionName"] = actionName;
View("NotFound").ExecuteResult(this.ControllerContext);
}
しかし、以前の戦略は、Bad/Unknown コントローラへのリクエストを処理しません。 例えば、私は "/IDoNotExist" を持っておらず、これをリクエストすると、ルーティング + オーバーライドを使用した場合の404ではなく、ウェブサーバーからの一般的な404ページが表示されます。
では最後に質問です。 MVCフレームワーク自体でルートなどを使ってこのようなリクエストをキャッチする方法はないのでしょうか?
それとも、404ハンドラとしてWeb.Config customErrorsをデフォルトで使用し、すべてを忘れるべきでしょうか? もしcustomErrorsを使うなら、Web.Configによる直接アクセスの制限のため、一般的な404ページを/Viewsの外側に保存しなければならないと仮定します。
どのように解決するのですか?
このコードは http://blogs.microsoft.co.il/blogs/shay/archive/2009/03/06/real-world-error-hadnling-in-asp-net-mvc-rc2.aspx ASP.net MVC 1.0でも同様に動作します。
以下は、httpの例外を処理する方法です。
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
// Log the exception.
ILogger logger = Container.Resolve<ILogger>();
logger.Error(exception);
Response.Clear();
HttpException httpException = exception as HttpException;
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
if (httpException == null)
{
routeData.Values.Add("action", "Index");
}
else //It's an Http Exception, Let's handle it.
{
switch (httpException.GetHttpCode())
{
case 404:
// Page not found.
routeData.Values.Add("action", "HttpError404");
break;
case 500:
// Server error.
routeData.Values.Add("action", "HttpError500");
break;
// Here you can handle Views to other error codes.
// I choose a General error template
default:
routeData.Values.Add("action", "General");
break;
}
}
// Pass exception details to the target error View.
routeData.Values.Add("error", exception);
// Clear the error on server.
Server.ClearError();
// Avoid IIS7 getting in the middle
Response.TrySkipIisCustomErrors = true;
// Call target Controller and pass the routeData.
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(
new HttpContextWrapper(Context), routeData));
}
関連
-
[解決済み】Automapperにタイプマップの設定がない、またはマッピングがサポートされていない - エラー
-
[解決済み] HTTPヘッダを送信した後、サーバーがステータスを設定できない IIS7.5
-
[解決済み] ファイルアップロード ASP.NET MVC 3.0
-
[解決済み] ASP.NET MVC Frameworkで複数のサブミットボタンを処理する方法は?
-
[解決済み] ASP.NET MVCでenumからドロップダウンリストを作成するにはどうすればよいですか?
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] ASP.NET MVCでビューをコンパイルする
-
[解決済み】1つのビューに複数のモデルを表示する
-
[解決済み] ASP.Net MVC デフォルトの HTTP ヘッダーを削除する方法は?
-
[解決済み] アクションリンクでエリア名を指定するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】同じキーのアイテムがすでに追加されています。
-
[解決済み] Razor View throwing "The name 'model' does not exist in the current context".
-
[解決済み] MVC 3 - 辞書に渡されたモデル項目の型は 'System.Collections.Generic.List`1 です。
-
[解決済み] 修正方法: ハンドラ "PageHandlerFactory-Integrated" のモジュールリストに "ManagedPipelineHandler" という不正なモジュールが含まれています。
-
[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?
-
[解決済み】1つのビューに複数のモデルを表示する
-
[解決済み】サービスは常にDTOを返すべきですか、それともドメインモデルも返すことができますか?
-
[解決済み】Java Server Faces 2.0の主なデメリットは何ですか?
-
[解決済み] Razorを使ってエンコードされていないJsonをViewに書き込むにはどうしたらいいですか?
-
[解決済み] ASP.NET MVC 404エラー処理 [重複]について