c# - 예외 - ASP.NET MVC 5 오류 처리



asp.net mvc 에러페이지 (2)

403 오류, 404 오류, MySpecialDomainException 으로 인한 모든 오류를 처리하고 다른 모든 오류 (IIS 구성의 오류 포함)에 대한 기본 오류 페이지를 제공하려고합니다. 모든 오류는 적절한 면도기 뷰를 반환해야합니다. 뷰 앞에 ErrorController 가 있으면 매우 좋을 것입니다. :

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 호스트에서 발생하는 오류를 잡아 내고 싶습니다. 질문 2 : IIS가 모든 404를 처리해야하는 것을 방지하기 위해 가능한 모든 URL과 일치하는 기본 경로를 추가하는 방법을 고려했습니다. IIS 404에도 등록하는 편이 낫습니다.

Q3 : 컨트롤러로 돌아가거나 ASPX / 정적 HTML 만 가능한 IIS 오류 페이지를 등록 할 수 있습니까?


Answer #1

가장 좋은 방법은 모든 유형의 오류 (Ajax 호출 / 예기치 않은 오류 모두)를 관리 할 수 ​​있기 때문에 Global.Asax를 사용하는 것입니다. 다른 사람들과 함께 할 수는 없습니다.

이렇게 :

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");
        }
    }
}

Answer #2

모든 애플리케이션에 황금 솔루션은 없습니다.

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





asp.net-mvc-5.1