3

ほとんどの場合、404エラーのカスタムエラーページが正しく呼び出されています。ただし、一部のURLは、カスタムエラーページをスキップして、代わりにiis404エラーページを呼び出します。なぜこうなった?

これは、IIS7.5で実行されているMVC4プロジェクトです。

//This invokes my Custom 404 error page.
http://192.168.1.10/test1/test2/test3

//This bypasses my Custom 404 and invokes the iis 404 error page.
http://192.168.1.10/test1/test2/test3/test4

//Web.config
<system.web>
  <customErrors mode="On" defaultRedirect="Error">
    <error statusCode="404" redirect="Error404" />
  </customErrors>
...

//Route
routes.MapRoute(
    name: "Error404",
    url: "error404",
    defaults: new { controller = "Error", action = "Error404" }
);

//Error Controller
public ActionResult Error404()
{
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true;

    return View();
}
4

3 に答える 3

3

カスタム エラーが時々バイパスされるように見える理由もわかりませんが、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.") });

Controller2番目に、名前付きを作成しました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 ページをオーバーライドするためのキーです。

それが役に立てば幸い!

于 2013-03-03T02:50:18.827 に答える