カスタム エラーが時々バイパスされるように見える理由もわかりませんが、MVC4 Web サイトで行ったことをお見せしましょう。
RouteCollection
まず、RouteConfig.csでキャッチオール ルートを作成しました。
routes.MapRoute(
name: "CatchAll",
url: "{*catchall}",
defaults: new { controller = "Error", action = "Index", statusCode = 404, error = new HttpException(404, "Route not found via RouteConfig.") });
Controller
2番目に、名前付きを作成しましたError
。唯一の仕事は、Web サイトでスローされた例外を処理することです。
public class ErrorController : Controller
{
public ActionResult Index(int statusCode, Exception error)
{
ErrorViewModel vm = new ErrorViewModel();
vm.CurrentException = error;
vm.InnerException = error.InnerException ?? null;
vm.StatusCode = statusCode;
Response.StatusCode = statusCode;
Response.TrySkipIisCustomErrors = true;
return View(vm);
}
}
ErrorViewModel を使用して、HTML ソース コードで詳細なエラーを表示しています。
3 番目に、メソッドGlobal.asax
をオーバーライドしてApplication_Error
、Web サイト内のすべての例外をキャッチし、Error
ステップ 1 で作成したコントローラーを介してそれらを処理しました。
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Server.ClearError();
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "Index");
routeData.Values.Add("error", exception);
if (exception.GetType() == typeof(HttpException))
{
routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
}
else
{
routeData.Values.Add("statusCode", 500);
}
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
それだけです。web.config から CustomErrors ノードを削除しました。この回答の大部分は、このブログ投稿で見つかりました。
の
Response.TrySkipIisCustomErrors = true;
IIS 404 ページをオーバーライドするためのキーです。
それが役に立てば幸い!