Подтвердить что ты не робот

Обработка ошибок ASP.NET MVC 5

Мы хотим обработать 403 ошибки, 404 ошибки, все ошибки из-за MySpecialDomainException и предоставить страницу ошибок по умолчанию для всех других ошибок (включая ошибки в конфигурации IIS!). Все ошибки должны возвращать правильные виды Razor, было бы очень приятно иметь 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()
  • Фильтр ошибок
  • элемент customErrors в web.config
  • Обработка в приложении Global.asax Application_Error

Q1: Каков рекомендуемый способ выполнения наших требований с помощью ASP.NET MVC 5?

Также мы хотим поймать ошибки, происходящие на хосте IIS. Q2: Чтобы IIS не работал с любыми 404, мы думали о добавлении маршрута по умолчанию, соответствующего всем возможным URL-адресам, - это рекомендуется? Лучше зарегистрироваться вместо этого для 404-го ИИС?

Q3: Возможно ли зарегистрировать страницу ошибок IIS, которая возвращается к контроллеру, или IIS, способный только ASPX/статический HTML?

4b9b3361

Ответ 1

Лучший способ - использовать 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");
        }
    }
}

Ответ 2

Для всех приложений нет золотого решения.

Вы можете отобразить дружественную страницу ошибки, используя httpErrors в web.config. В отличие от customErrors это параметр уровня IIS и даже покажет вам дружественную страницу ошибок для ошибок, которые не входят в ASP.NET.

Для регистрации ошибок я бы рекомендовал пойти с HttpModule как ELMAH: https://code.google.com/p/elmah/

Я написал целую запись в блоге об этом и объяснил различные способы обработки ошибок: http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging

Ответ 3

Лучшим способом обработки ошибок является расширение атрибута handleerror. Атрибут ошибки обработки имеет следующие преимущества.

  • С HandleErrorAttribute мы получаем больше контроля над исключением обработки. HandleError позволяет нам обрабатывать ошибки по-разному для различные контроллеры и действия легко, где в Application_Error для получения этой функции мы берем на себя помощь петли переключения.

  • Как только вы попадете в Application_Error, вы находитесь вне MVC, и вы потерять ControllerContext, и тогда мы не сможем сделать много вещей, которые будут легко с помощью HandleError.

см. следующее сообщение о том, как расширить атрибут обработки ошибок и преимущества

Преимущества [HandleError] над Application_Error

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

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