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

мы хотим обработать 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, некоторые из которых, скорее всего, устарели. Среди те:

  • контроллер.OnException()
  • фильтр ошибка
  • элемент customerrors в web.config
  • работа в мировой.эйсакс в application_error для перехвата

Вопрос 1: что порекомендованный путь выполнить наши требования с ASP.NET MVC 5?

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

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

3 ответов


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

нет идеального решения для всех приложений.

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

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

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


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

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

  • Как только вы попадете в 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