10
votes

MVC [GuinGareError] GuanderRattribute appelé deux fois lors de l'utilisation de la journalisation globale

Dans une application Web MVC3, j'utilisais

public class MyHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            // Write to log code
            base.OnException(context);
        }
    }


0 commentaires

4 Réponses :


2
votes

Vous pouvez créer un ifilterprovider code> qui vérifiera si le filtre a déjà été appliqué à cette action: xxx pré>

puis, au lieu d'enregistrer votre filtre avec le GlobalFilterCollection Code>, vous enregistrez votre fournisseur de filtres dans Application_Start () CODE> P>

public class MyHandleErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        if(context.ExceptionHandled) return;

        // Write to log code
        base.OnException(context);
        context.ExceptionHandled = true;
    }
}


0 commentaires

3
votes

Essayez ceci,

public class MyHandleErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
         var exceptionHandled = context.ExceptionHandled;

         base.OnException(context);                          

         if(!exceptionHandled && context.ExceptionHandled)
           // log the error.
    }
}


0 commentaires

9
votes

Je crois que j'ai trouvé une solution propre à cela moi-même. L'extension du guérison semblait être une bonne idée, mais maintenant je pense que c'était une étape dans la mauvaise direction. Je ne voulais pas gérer les erreurs différemment, écrivez simplement des exceptions à vous connecter une fois avant que le guérisseur les a choisis. Pour cette raison, le manuserror par défaut peut être laissé en place tel quel. Bien que OneXception puisse être appelée plusieurs fois, il semble être entièrement bénigné dans la mise en œuvre standard du guidonerrorattribute.

Au lieu de cela, j'ai créé un filtre de journalisation d'exception: P>

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new LoggedExceptionFilter());
        filters.Add(new HandleErrorAttribute());
    }


1 commentaires

Bonjour, bonne solution, mais comment pouvez-vous obtenir plus d'informations de la source de l'exception comme le nom de la classe / de la méthode?



-1
votes

Je trouvais réellement la solution pour maintenir la méthode onexception de la cuisson deux fois. Si vous utilisez dans la méthode filterConfig.registerglobalfilters (), commencez le registre du guidonerraTtribute: xxx

En fait, j'ai également utilisé le guérisseur intégré sans l'enregistrer, et il travaillé bien. Il suffit d'avoir des erreurs personnalisées activées: xxx


1 commentaires

Peut-être devriez-vous relire la question. Il veut utiliser les deux en même temps.