Gestione degli errori di ASP.NET MVC 5

Vogliamo gestire 403 errori, 404 errori, tutti gli errori dovuti a MySpecialDomainException e fornire una pagina di errore predefinita per tutti gli altri errori (inclusi gli errori nella configurazione di IIS!). Tutti gli errori dovrebbero restituire le corrette viste del razor, sarebbe molto bello avere un ErrorController davanti alle viste. Ad esempio qualcosa del genere:

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

Attualmente trovi molti modi diversi di farlo sul www, alcuni probabilmente obsoleti. Fra quelli:

  • Controller.OnException ()
  • Filtro errore
  • elemento customErrors in web.config
  • Gestione in Application.Error di Global.asax

Q1: Qual è il modo consigliato per soddisfare i nostri requisiti con ASP.NET MVC 5?

Inoltre vogliamo rilevare gli errori che si verificano nell’host IIS. Q2: per evitare che IIS debba gestire qualsiasi 404s abbiamo pensato di aggiungere una route predefinita che corrisponda a tutti gli URL possibili – è consigliabile? È meglio registrarsi invece per IIS 404s?

Q3: È persino ansible registrare una pagina di errore di IIS che risale a un controller, oppure IIS è in grado solo di ASPX / HTML statico?

Il modo migliore è utilizzare Global.Asax, perché puoi gestire tutti i tipi di errori (chiamate Ajax / tutti gli errori imprevisti). con gli altri non puoi farlo.

Come questo:

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

Non esiste una soluzione d’oro per tutte le applicazioni.

Puoi visualizzare una pagina di errore amichevole usando httpErrors in web.config. A differenza di customErrors, questa è un’impostazione a livello di IIS e mostrerà anche una pagina di errore amichevole per errori che non provengono da ASP.NET.

Per la registrazione degli errori, consiglierei di utilizzare un HttpModule come ELMAH: https://code.google.com/p/elmah/

Ho scritto un intero post su questo blog e dove spiego i diversi modi di gestire gli errori: http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging

Un modo migliore di gestire l’errore è l’estensione dell’attributo handleerror. L’attributo di errore Handle ha i seguenti vantaggi

  • Con HandleErrorAttribute otteniamo un maggiore controllo sulla gestione delle eccezioni. HandleError ci consente di gestire l’errore in modo diverso per i vari controller e le azioni facilmente dove in Application_Error per ottenere questa funzionalità prendiamo l’aiuto di switch loop.

  • Una volta che ti trovi in ​​Application_Error, sei fuori da MVC e perdi ControllerContext e quindi non possiamo fare molte cose che saranno facilmente possibili con HandleError.

vedi il post seguente per come estendere attributi e vantaggi di gestione degli errori

Vantaggi di [HandleError] su 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