すべてをキャッチし、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
}
}
プロジェクトのルートweb.configファイルの下にこの行を追加します。
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
<remove statusCode="500" />
<error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
<remove name="FormsAuthentication" />
</modules>
これは使用するときに問題になる可能性があります
throw new HttpException(404);
あなたがそれをキャッチしたいとき、私はあなたのウェブ設定を編集する他の方法を知りません。
キャッチオールルートを作成する代わりに、Application_EndRequest
メソッドをMvcApplication
ごとに Marco's Better-Than-Unicorns MVC 404 Answer で指定します。
RouterConfig.cs
の中に、次のコードを追加します。
routes.MapRoute(
name: "Error",
url: "{id}",
defaults: new
{
controller = "Error",
action = "PageNotFound"
});
ルートを解決できない場合、MVCフレームワークは404エラーを通過します。最良のアプローチは、例外フィルターを使用することです...カスタム例外フィルターを作成し、このようにします。
public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html");
}
}