すべてをキャッチし、ユーザーを ASP.NET MVC の 404 ビューにバウンスする最終ルートを作成することは可能ですか?
注: IIS 設定でこれを設定したくありません。
すべてをキャッチし、ユーザーを ASP.NET MVC の 404 ビューにバウンスする最終ルートを作成することは可能ですか?
注: IIS 設定でこれを設定したくありません。
答えは自分で見つけました。
Richard Dingwallは、さまざまな戦略を説明する優れた投稿をしています。特に FilterAttribute ソリューションが気に入っています。私はウィリーニリーの周りに例外を投げるのが好きではないので、それを改善できるかどうか見ていきます:)
global.asax については、次のコードを登録する最後のルートとして追加するだけです。
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "StaticContent", action = "PageNotFound" }
);
この質問が最初に来ましたが、より簡単な答えは後の質問にありました。
カスタム ASP.NET MVC 404 エラー ページのルーティング
この記事のビューを返す ErrorController を作成することで、エラー処理が機能するようになりました。また、global.asax のルートに「Catch All」を追加する必要がありました。
Web.configにない場合、これらのエラーページにどのように到達するかわかりません..? 私のWeb.configは次を指定する必要がありました:
customErrors mode="On" defaultRedirect="~/Error/Unknown"
そして、私も追加しました:
error statusCode="404" redirect="~/Error/NotFound"
お役に立てれば。
とてもシンプルなので、今はこの方法が気に入っています。
<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/Error/PageNotFound/" />
</customErrors>
また、以下のように Global.asax.cs で NOT FOUND エラーを処理できます。
protected void Application_Error(object sender, EventArgs e)
{
Exception lastErrorInfo = Server.GetLastError();
Exception errorInfo = null;
bool isNotFound = false;
if (lastErrorInfo != null)
{
errorInfo = lastErrorInfo.GetBaseException();
var error = errorInfo as HttpException;
if (error != null)
isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
}
if (isNotFound)
{
Server.ClearError();
Response.Redirect("~/Error/NotFound");// Do what you need to render in view
}
}
これは、使用時に問題になる可能性があります
throw new HttpException(404);
あなたがそれをキャッチしたいとき、私はあなたのウェブ設定を編集する以外の方法を知りません.
キャッチオールルートを作成する代わりに、MarcoのBetter-Than-Unicorns MVC404AnswerにメソッドApplication_EndRequest
を追加することもできます。MvcApplication