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 }
Home
Index
動作する別の例:
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));
}
}