3

MVC アプリケーション内で 500 および 404 エラーを「すべてキャッチ」しようとしていますが、記事や質問をすべて読んだ後でも、何が必要なのか把握できないようです。

Web.config(これにより、500 個のエラーが に送られます~/Views/Shared/Error.cshtml):

<system.web>
    <customErrors mode="On" redirectMode="ResponseRewrite" />
</system.web>

HomeController上記のセットアップをテストするために、エラーをスローするようにセットアップしました。

public ActionResult Index()
{
    //Testing errors
    throw new Exception("Exception");

    return View();
}

私のGlobal.asax.csでは、500 エラーをログに記録するために次のものがあります。

protected void Application_Error()
{
    var ex = Server.GetLastError();

    //Custom ExceptionLog
    new ExceptionLogHelper().Add("Application_Error", Response.Status, ex);
}

404 エラーの場合:

RouteConfig.csの には、次のルートがありますが、すべての 404 をキャッチできないようです。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Error",
            url: "Error/{code}",
            defaults: new { controller = "Error", action = "Index", code = UrlParameter.Optional }
        );

        //routes.MapRoute(
        //  name: "Controllers",
        //  url: "{controller}/{action}/{id}",
        //  defaults: new { controller = "Error", action = "Index", code = UrlParameter.Optional }
        //);

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        //Keep at bottom
        routes.MapRoute("CatchAll", "{*url}", new { controller = "Error", action = "Index", name = "no-route-found", code = "404" });

    }
}

CatchAll一番下は、前のルートと一致しないものをすべてキャッチする良い仕事をしています.

他にもたくさんのテスト シナリオがありますが、私を悩ませているのは次の UrlParameter です。

http://localhost:64275/does/not/exist/

上記のURLは基本的にhttp://localhost:64275/{controller}/{action}/{id}

という名前のコントローラーがありません。コントローラーが一致しない場合、アクションがデフォルトのコントローラーになるdoesと思いました。defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }HomeIndex

動作する別の例:

http://localhost:64275/a/a/a/a/ (because it has 4 parts, not 3 or less)

誰かが私がどこで間違っているのか説明できますか? ...そして、私が理解していないことは何ですか?

次のようなものを実装する必要があります: .Net MVC Routing Catchall が機能しない(Darin Dimitrov の回答)

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    HttpException httpException = exception as HttpException;
    if (httpException != null)
    {
        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "HttpError500");

            if (httpException.GetHttpCode() == 404)
            {
                routeData.Values["action"] = "HttpError404";
            }

        Server.ClearError();
        Response.Clear();
        IController errorController = new ErrorController();
        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }
}
4

1 に答える 1