J'essaie d'utiliser ELMAH pour enregistrer les erreurs dans mon application ASP.NET MVC, cependant lorsque j'utilise l'attribut [HandleError] sur mes contrôleurs, ELMAH n'enregistre aucune erreur lorsqu'elles se produisent.
Comme je le suppose, car ELMAH enregistre uniquement les erreurs non gérées et l'attribut [HandleError] gère l'erreur, donc pas besoin de la consigner.
Comment modifier ou comment modifier l'attribut pour qu'ELMAH puisse savoir qu'il y a une erreur et la consigner.
Edit: Permettez-moi de m'assurer que tout le monde comprend, je sais que je peux modifier l'attribut, ce n'est pas la question que je pose ... ELMAH est contourné lors de l'utilisation de l'attribut handleerror, ce qui signifie qu'il ne verra pas qu'il y a eu une erreur car elle a été gérée déjà par l'attribut ... Ce que je demande, c'est qu'il y a un moyen de faire voir ELMAH l'erreur et de l'enregistrer même si l'attribut l'a gérée ... J'ai cherché autour et je ne vois aucune méthode à appeler pour le forcer à se connecter l'erreur....
la source
Réponses:
Vous pouvez sous
HandleErrorAttribute
-classer et remplacer sonOnException
membre (pas besoin de copier) pour qu'il enregistre l'exception avec ELMAH et uniquement si l'implémentation de base la gère. La quantité minimale de code dont vous avez besoin est la suivante:L'implémentation de base est invoquée en premier, ce qui lui permet de marquer l'exception comme étant gérée. Ce n'est qu'alors que l'exception est signalée. Le code ci-dessus est simple et peut poser des problèmes s'il est utilisé dans un environnement où il
HttpContext
peut ne pas être disponible, comme les tests. Par conséquent, vous voudrez du code qui soit plus défensif (au prix d'être légèrement plus long):Cette deuxième version essaiera d'abord d'utiliser la signalisation d'erreur d'ELMAH, ce qui implique le pipeline entièrement configuré comme la journalisation, l'envoi, le filtrage et ce que vous avez. A défaut, il tente de voir si l'erreur doit être filtrée. Sinon, l'erreur est simplement enregistrée. Cette implémentation ne gère pas les notifications par courrier électronique. Si l'exception peut être signalée, un e-mail sera envoyé s'il est configuré pour le faire.
Vous devrez peut-être également vous assurer que si plusieurs
HandleErrorAttribute
instances sont en vigueur, la journalisation en double ne se produit pas, mais les deux exemples ci-dessus devraient vous aider à démarrer.la source
Désolé, mais je pense que la réponse acceptée est exagérée. Tout ce que vous devez faire est le suivant:
puis l'enregistrer (l'ordre est important) dans Global.asax.cs:
la source
HandleErrorAttribute
, pas besoin de passer outreOnException
surBaseController
. C'est supposé à la réponse acceptée.new UnhandledLoggedException(Exception thrown)
qui ajoute quelque chose auMessage
avant de le renvoyer.ElmahHandledErrorLoggerFilter()
elmah simplement en enregistrant les erreurs non gérées, mais pas gérées. J'ai enregistré les filtres dans le bon ordre, comme vous l'avez mentionné, des réflexions?Il y a maintenant un package ELMAH.MVC dans NuGet qui inclut une solution améliorée par Atif et également un contrôleur qui gère l'interface elmah dans le routage MVC (plus besoin d'utiliser cet axd)
Le problème avec cette solution (et avec toutes celles ici) ) est que d'une manière ou d'une autre, le gestionnaire d'erreurs elmah gère réellement l'erreur, ignorant ce que vous pouvez configurer en tant que balise customError ou via ErrorHandler ou votre propre gestionnaire d'erreurs
La meilleure solution à mon humble avis est de créer un filtre qui agira à la fin de tous les autres filtres et enregistrera les événements qui ont déjà été traités. Le module elmah doit prendre en charge la journalisation des autres erreurs non gérées par l'application. Cela vous permettra également d'utiliser le moniteur de santé et tous les autres modules qui peuvent être ajoutés à asp.net pour consulter les événements d'erreur
J'ai écrit ceci en regardant avec un réflecteur au ErrorHandler à l'intérieur d'elmah.mvc
Maintenant, dans votre configuration de filtre, vous voulez faire quelque chose comme ceci:
Notez que j'ai laissé un commentaire là pour rappeler aux gens que s'ils veulent ajouter un filtre global qui gérera réellement l'exception, il devrait aller AVANT ce dernier filtre, sinon vous rencontrez le cas où l'exception non gérée sera ignorée par ElmahMVCErrorFilter car il n'a pas été géré et il devrait être journalisé par le module Elmah mais le filtre suivant marque l'exception comme gérée et le module l'ignore, ce qui fait que l'exception ne se transforme jamais en elmah.
Maintenant, assurez-vous que les paramètres d'application pour Elmah dans votre configuration Web ressemblent à ceci:
L'important ici est "elmah.mvc.disableHandleErrorFilter", si c'est faux, il utilisera le gestionnaire à l'intérieur d'elmah.mvc qui gérera réellement l'exception en utilisant le HandleErrorHandler par défaut qui ignorera vos paramètres d'erreur personnalisés
Cette configuration vous permet de définir vos propres balises ErrorHandler dans les classes et les vues, tout en enregistrant ces erreurs via ElmahMVCErrorFilter, en ajoutant une configuration customError à votre web.config via le module elmah, et même en écrivant vos propres gestionnaires d'erreur. La seule chose que vous devez faire est de ne pas ajouter de filtres qui gèreront réellement l'erreur avant le filtre elmah que nous avons écrit. Et j'ai oublié de mentionner: pas de doublons dans Elmah.
la source
Vous pouvez prendre le code ci-dessus et aller plus loin en introduisant une fabrique de contrôleurs personnalisés qui injecte l'attribut HandleErrorWithElmah dans chaque contrôleur.
Pour plus d'informations, consultez ma série de blogs sur la connexion à MVC. Le premier article traite de la configuration et du fonctionnement d'Elmah pour MVC.
Il y a un lien vers le code téléchargeable à la fin de l'article. J'espère que cela pourra aider.
http://dotnetdarren.wordpress.com/
la source
Je suis nouveau dans ASP.NET MVC. J'ai rencontré le même problème, ce qui suit est mon réalisable dans mon Erorr.vbhtml (cela fonctionne si vous avez seulement besoin de consigner l'erreur en utilisant le journal Elmah)
C'est tout simplement!
la source
Une solution complètement alternative consiste à ne pas utiliser le MVC
HandleErrorAttribute
et à s'appuyer à la place sur la gestion des erreurs ASP.Net, avec laquelle Elmah est conçu pour fonctionner.Vous devez supprimer le global par défaut
HandleErrorAttribute
d'App_Start \ FilterConfig (ou Global.asax), puis configurer une page d'erreur dans votre Web.config:Notez que cela peut être une URL routée MVC, donc ce qui précède serait redirigé vers l'
ErrorController.Index
action lorsqu'une erreur se produit.la source
Pour moi, il était très important de faire fonctionner la journalisation des e-mails. Après un certain temps, je découvre que cela n'a besoin que de 2 lignes de code de plus dans l'exemple Atif.
J'espère que cela aidera quelqu'un :)
la source
C'est exactement ce dont j'avais besoin pour ma configuration de site MVC!
J'ai ajouté une petite modification à la
OnException
méthode pour gérer plusieursHandleErrorAttribute
instances, comme suggéré par Atif Aziz:Je vérifie simplement
context.ExceptionHandled
avant d'appeler la classe de base, juste pour savoir si quelqu'un d'autre a géré l'exception avant le gestionnaire actuel.Cela fonctionne pour moi et je poste le code au cas où quelqu'un d'autre en aurait besoin et pour demander si quelqu'un sait si j'ai oublié quelque chose.
J'espère que c'est utile:
la source