web-dev-qa-db-fra.com

Traitement des erreurs ASP.NET MVC 5

Nous voulons gérer les erreurs 403, 404, toutes les erreurs dues à un MySpecialDomainException et fournir une page d'erreur par défaut pour toutes les autres erreurs (y compris les erreurs dans la configuration IIS!). Toutes les erreurs doivent retourner des vues Razor correctes, il serait très agréable d’avoir un ErrorController devant les vues. Par exemple quelque chose comme ceci:

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

Actuellement, vous trouvez de nombreuses façons de le faire sur le site Web, certaines probablement obsolètes. Parmi ceux-ci:

  • Controller.OnException ()
  • Filtre d'erreur
  • élément customErrors dans web.config
  • Traitement dans Application_Error de Global.asax

Q1: Quelle est la méthode recommandée pour répondre à nos exigences avec ASP.NET MVC 5?

Nous voulons également détecter les erreurs survenant dans l'hôte IIS. Q2: Pour éviter que IIS ne gère aucun 404, nous avons pensé ajouter une route par défaut correspondant à toutes les URL possibles. Est-ce recommandé? Mieux vaut-il également s’inscrire pour les 404 d’IIS?

Q3: Est-il même possible d’enregistrer une page d’erreur IIS qui retourne à un contrôleur ou est capable de IIS ASPX/HTML statique uniquement?

38
D.R.

Le meilleur moyen consiste à utiliser Global.Asax, car vous pouvez gérer tous les types d’erreurs (appels Ajax/toutes les erreurs inattendues). avec d'autres, vous ne pouvez pas le faire.

Comme ça:

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

Il n'y a pas de solution en or pour toutes les applications.

Vous pouvez afficher une page d'erreur conviviale à l'aide de httpErrors dans web.config. Contrairement à customErrors, il s'agit d'un paramètre de niveau IIS). Il vous montrera même une page d'erreur conviviale pour les erreurs ne provenant pas d'ASP.NET.

Pour la consignation des erreurs, je recommanderais d'utiliser un HttpModule comme ELMAH: https://code.google.com/p/elmah/

J'ai écrit un article entier sur ce sujet et sur les différentes manières de traiter les erreurs: http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging =

41
dustinmoris

Un meilleur moyen de gérer les erreurs consiste à étendre l'attribut handleerror. L'attribut Handle error présente les avantages suivants

  • Avec HandleErrorAttribute, nous obtenons plus de contrôle sur la gestion des exceptions. HandleError nous permet de gérer les erreurs différemment pour différents contrôleurs et actions facilement. Dans Application_Error pour obtenir cette fonctionnalité, nous utilisons l’aide de la boucle de commutation.

  • Une fois que vous êtes dans Application_Error, vous n’êtes plus dans MVC et vous perdrez ControllerContext. Nous ne pourrons alors rien faire qui puisse être facilement possible avec HandleError.

voir le post suivant pour savoir comment étendre l'attribut de gestion des erreurs et ses avantages

Avantages de [HandleError] sur 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

7
Mahesh