573 Stimmen

Wie kann man ELMAH dazu bringen, mit dem ASP.NET MVC [HandleError]-Attribut zu funktionieren?

Ich versuche, ELMAH zu verwenden, um Fehler in meiner ASP.NET MVC-Anwendung zu protokollieren. Wenn ich jedoch das [HandleError]-Attribut in meinen Controllern verwende, protokolliert ELMAH keine Fehler, wenn sie auftreten.

Ich vermute, dass ELMAH nur nicht behandelte Fehler protokolliert und das [HandleError]-Attribut den Fehler behandelt, sodass kein Bedarf besteht, ihn zu protokollieren.

Wie kann ich das Attribut ändern oder wie könnte ich das Attribut ändern, so dass ELMAH weiß, dass ein Fehler aufgetreten ist und ihn protokolliert.

Bearbeitung: Lassen Sie mich sicherstellen, dass jeder versteht, ich weiß, dass ich das Attribut ändern kann, das ist nicht die Frage, die ich stelle... ELMAH wird umgangen, wenn das HandleError-Attribut verwendet wird, was bedeutet, dass es den Fehler nicht sieht, weil er bereits vom Attribut behandelt wurde... Was ich frage, ob es eine Möglichkeit gibt, ELMAH den Fehler sehen und protokollieren zu lassen, obwohl das Attribut ihn behandelt hat... Ich habe gesucht und keine Methoden gefunden, die aufgerufen werden könnten, um ihn dazu zu zwingen, den Fehler zu protokollieren....

12 Stimmen

Wow, ich hoffe, Jeff oder Jared würden diese Frage beantworten. Sie verwenden ELMAH für Stackoverflow ;)

11 Stimmen

Hmm, komisch - wir verwenden nicht das HandleErrorAttribute - Elmah ist in unserem -Abschnitt der web.config eingerichtet. Gibt es Vorteile bei der Verwendung des HandleErrorAttribute?

1 Stimmen

Nun ja, ich glaube, dass du diese nervige Querystring-Abfrage nicht in der URL erhältst, und wenn ein Fehler auftritt, wird die URL nicht auf die im benutzerdefinierten Fehler im Web.config angegebene umgeleitet... für mich ist es einfach sauberer

7voto

user716264 Punkte 95

Ich bin neu in ASP.NET MVC. Ich hatte das gleiche Problem, das folgende ist meine funktionierende Lösung in meiner Erorr.vbhtml (es funktioniert, wenn Sie nur den Fehler mit Elmah loggen müssen)

@ModelType System.Web.Mvc.HandleErrorInfo

    @Code
        ViewData("Title") = "Fehler"
        Dim item As HandleErrorInfo = CType(Model, HandleErrorInfo)
        //Um den Fehler mit Elmah zu protokollieren
        Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(New Elmah.Error(Model.Exception, HttpContext.Current))
    End Code

    Es tut uns leid, es ist ein Fehler aufgetreten beim Verarbeiten Ihrer Anfrage.

    @item.ActionName
    @item.ControllerName
    @item.Exception.Message

Es ist einfach!

0 Stimmen

Das ist mit Abstand die einfachste Lösung. Keine Notwendigkeit, benutzerdefinierte Handler und Dinge zu schreiben oder zu registrieren. Funktioniert gut für mich.

3 Stimmen

Wird für jede JSON / non-HTML-Antworten ignoriert werden.

6 Stimmen

Auch dies führt Funktionalität auf der Service-Ebene in einer Ansicht durch. Gehört hier nicht hin.

6voto

Komio Punkte 61

Für mich war es sehr wichtig, dass das E-Mail-Logging funktioniert. Nach einiger Zeit habe ich festgestellt, dass Atifs Beispiel nur 2 zusätzliche Codezeilen benötigt.

public class HandleErrorWithElmahAttribute : HandleErrorAttribute
{
    static ElmahMVCMailModule error_mail_log = new ElmahMVCMailModule();

    public override void OnException(ExceptionContext context)
    {
        error_mail_log.Init(HttpContext.Current.ApplicationInstance);
        [...]
    }
    [...]
}

Ich hoffe, das wird jemandem helfen :)

3voto

ilmatte Punkte 1462

Dies ist genau das, was ich für die Konfiguration meiner MVC-Site benötigt habe!

Ich habe eine kleine Änderung an der OnException-Methode vorgenommen, um mit mehreren Instanzen von HandleErrorAttribute umzugehen, wie von Atif Aziz vorgeschlagen:

Denken Sie daran, dass Sie sicherstellen müssen, dass bei mehreren Instanzen von HandleErrorAttribute keine doppelten Protokollierungen auftreten.

Ich überprüfe einfach context.ExceptionHandled bevor ich die Basisklasse aufrufe, einfach um herauszufinden, ob jemand anderes die Ausnahme vor dem aktuellen Handler behandelt hat.
Es funktioniert für mich und ich poste den Code, falls es jemand anders braucht und um zu fragen, ob ich etwas übersehen habe.

Hoffe es ist nützlich:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // wenn nicht behandelt, wird es sowieso protokolliert
        || RaiseErrorSignal(e)        // lieber Signalgebung, falls möglich
        || IsFiltered(context))       // gefiltert?
        return;

    LogException(e);
}

0 Stimmen

Sie scheinen keine "if"-Anweisung um das Aufrufen von base.OnException() zu haben.... Und (exceptionHandledByPreviousHandler || !context.ExceptionHandled || ...) heben sich gegenseitig auf und werden immer wahr sein. Fehlt mir etwas?

0 Stimmen

Zuerst prüfe ich, ob ein anderer Handler, der vor dem aktuellen aufgerufen wurde, die Ausnahme behandelt hat, und ich speichere das Ergebnis in der Variablen: exceptionHandlerdByPreviousHandler. Dann gebe ich dem aktuellen Handler die Möglichkeit, die Ausnahme selbst zu behandeln: base.OnException(context).

0 Stimmen

Zuerst überprüfe ich, ob ein anderer Handler, der vor dem aktuellen aufgerufen wurde, die Ausnahme behandelt hat, und speichere das Ergebnis in der Variablen: exceptionHandlerdByPreviousHandler. Dann gebe ich dem aktuellen Handler die Chance, die Ausnahme selbst zu behandeln: base.OnException(context). Wenn die Ausnahme zuvor nicht behandelt wurde, kann es sein: 1 - Sie wird vom aktuellen Handler behandelt, dann: exceptionHandledByPreviousHandler = false and !context.ExceptionHandled = false 2 - Sie wird nicht vom aktuellen Handler behandelt und: exceptionHandledByPreviousHandler = false and !context.ExceptionHandled wahr. Nur Fall 1 wird protokolliert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X