web-dev-qa-db-ja.com

ASP.NET MVC 5エラー処理

403エラー、404エラー、MySpecialDomainExceptionに起因するすべてのエラーを処理し、他のすべてのエラー(IIS構成のエラーを含む)のデフォルトのエラーページを提供します!)すべてのエラーは適切なRazorビューを返す必要がありますが、ビューの前にErrorControllerがあると非常に便利ですEgこのようなもの:

public class ErrorController : Controller
{
    public ViewResult NotFound () { return View(); }
    public ViewResult Forbidden () { return View(); }
    public ViewResult Default ()
    {
        var ex = ObtainExceptionFromSomewhere();
        if(ex is MySpecialDomainException)
            return View("MySpecialDomainException", new ErrorModel { Exception = ex });

        return View("GeneralError", new ErrorModel { Exception = ex });
    }
}

現在、wwwでそれを行うための多くの異なる方法を見つけていますが、いくつかはおそらく時代遅れです。それらの中で:

  • Controller.OnException()
  • エラーフィルター
  • web.configのcustomErrors要素
  • Global.asaxのApplication_Errorでの処理

Q1: ASP.NET MVC 5の要件を満たすために推奨される方法は何ですか?

また、IISホストで発生するエラーをキャッチします。Q2:それを防ぐために、IISは、考えていた404すべての可能なURLに一致するデフォルトルートの追加について-これは推奨されますか?IISの404にも代わりに登録する方が良いですか?

Q3:コントローラに戻るIISエラーページを登録することも可能ですか、またはIIS ASPXに対応/静的HTMLのみ?

38
D.R.

最善の方法はGlobal.Asaxを使用することです。これは、すべてのタイプのエラー(Ajax呼び出し/すべての予期しないエラー)を管理できるためです。他の人とはできません。

このような:

protected void Application_Error()
{
    HttpContext httpContext = HttpContext.Current;
    if (httpContext != null)
    {
        RequestContext requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext;
        /* When the request is ajax the system can automatically handle a mistake with a JSON response. 
           Then overwrites the default response */
        if (requestContext.HttpContext.Request.IsAjaxRequest())
        {
            httpContext.Response.Clear();
            string controllerName = requestContext.RouteData.GetRequiredString("controller");
            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
            IController controller = factory.CreateController(requestContext, controllerName);
            ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);

            JsonResult jsonResult = new JsonResult
            {
                Data = new { success = false, serverError = "500" },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            jsonResult.ExecuteResult(controllerContext);
            httpContext.Response.End();
        }
        else
        {
            httpContext.Response.Redirect("~/Error");
        }
    }
}
50
natnael88

すべてのアプリケーションに最適なソリューションはありません。

Web.configのhttpErrorsを使用して、わかりやすいエラーページを表示できます。 customErrorsとは異なり、これはIISレベル設定であり、ASP.NET内からではないエラーのわかりやすいエラーページも表示します。

エラーロギングについては、ELMAHのようなHttpModuleを使用することをお勧めします。 https://code.google.com/p/elmah/

私はこれについてブログ記事全体を書き、エラー処理のさまざまな方法を説明しています: http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging =

41
dustinmoris

エラーを処理するより良い方法は、handleerror属性を拡張することです。エラー処理属性には次の利点があります

  • HandleErrorAttributeを使用すると、例外処理をより詳細に制御できます。 HandleErrorを使用すると、Application_Errorでこの機能を取得するためにスイッチループの助けを借りて、コントローラーやアクションごとにエラーを簡単に処理できます。

  • Application_Errorに入ると、MVCが終了し、ControllerContextを失うことになり、HandleErrorで簡単にできることはほとんどできなくなります。

エラー処理属性と利点を拡張する方法については、次の投稿を参照してください

Application_Errorに対する[HandleError]の利点

http://maheshde.blogspot.com.au/2012/09/error-handing-with-mvc-using-custom.html

http://www.codeproject.com/Articles/731913/Exception-Handling-in-MVC

7
Mahesh