Wie fange ich alle nicht behandelten Ausnahmen ab, die in ASP.NET Web Api auftreten, damit ich sie protokollieren kann?
Bisher habe ich versucht:
- Erstellen und registrieren Sie eine
ExceptionHandlingAttribute
- Implementieren Sie eine
Application_Error
Methode inGlobal.asax.cs
- Etwas abonnieren
AppDomain.CurrentDomain.UnhandledException
- Etwas abonnieren
TaskScheduler.UnobservedTaskException
Der behandelt ExceptionHandlingAttribute
erfolgreich Ausnahmen, die in Controller-Aktionsmethoden und Aktionsfiltern ausgelöst werden, andere Ausnahmen werden jedoch nicht behandelt, z. B.:
- Ausnahmen, die ausgelöst werden, wenn eine
IQueryable
von einer Aktionsmethode zurückgegebene Methode nicht ausgeführt werden kann - Ausnahmen, die von einem Nachrichtenhandler ausgelöst werden (dh
HttpConfiguration.MessageHandlers
) - Ausnahmen beim Erstellen einer Controller-Instanz
Wenn eine Ausnahme dazu führen soll, dass ein 500 Internal Server Error an den Client zurückgegeben wird, möchte ich, dass er protokolliert wird. Die Implementierung Application_Error
hat diesen Job in Web Forms und MVC gut gemacht - was kann ich in Web Api verwenden?
c#
asp.net-web-api
unhandled-exception
Joe Daley
quelle
quelle
Antworten:
Dies ist jetzt möglich mit WebAPI 2.1 (siehe Was ist neu ):
Erstellen Sie eine oder mehrere Implementierungen von IExceptionLogger. Beispielsweise:
Registrieren Sie sich dann bei der HttpConfiguration Ihrer Anwendung in einem Konfigurationsrückruf wie folgt:
oder direkt:
quelle
Die Antwort des Yuval dient zum Anpassen von Antworten auf nicht behandelte Ausnahmen, die von der Web-API abgefangen wurden, und nicht zum Protokollieren, wie auf der verlinkten Seite angegeben . Weitere Informationen finden Sie im Abschnitt Verwendungszweck auf der Seite. Der Logger wird immer aufgerufen, der Handler jedoch nur, wenn eine Antwort gesendet werden kann. Kurz gesagt, verwenden Sie den Logger zum Protokollieren und den Handler zum Anpassen der Antwort.
Übrigens verwende ich Assembly v5.2.3 und die
ExceptionHandler
Klasse hat dieHandleCore
Methode nicht. Das Äquivalent, denke ich, istHandle
. Eine einfache UnterklasseExceptionHandler
(wie in Yuvals Antwort) funktioniert jedoch nicht. In meinem Fall muss ichIExceptionHandler
Folgendes implementieren .Beachten Sie, dass Sie Ihren Handler im Gegensatz zum Logger registrieren, indem Sie den Standardhandler ersetzen und nicht hinzufügen.
quelle
Um meine eigene Frage zu beantworten, ist dies nicht möglich!
Die Behandlung aller Ausnahmen, die interne Serverfehler verursachen, scheint eine grundlegende Funktion zu sein, über die die Web-API verfügen sollte. Daher habe ich bei Microsoft eine Anfrage für einen globalen Fehlerbehandler für die Web-API gestellt :
https://aspnetwebstack.codeplex.com/workitem/1001
Wenn Sie einverstanden sind, gehen Sie zu diesem Link und stimmen Sie dafür ab!
In der Zwischenzeit zeigt der hervorragende Artikel ASP.NET Web API Exception Handling einige verschiedene Möglichkeiten, um einige verschiedene Fehlerkategorien abzufangen. Es ist komplizierter als es sein sollte und fängt nicht alle internen Serverfehler ab, aber es ist der beste Ansatz, der heute verfügbar ist.
Update: Die globale Fehlerbehandlung ist jetzt implementiert und in den nächtlichen Builds verfügbar! Es wird in ASP.NET MVC v5.1 veröffentlicht. So funktioniert es: https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling
quelle
Sie können auch einen globalen Ausnahmebehandler erstellen, indem Sie die
IExceptionHandler
Schnittstelle implementieren (oder dieExceptionHandler
Basisklasse erben ). Es wird das letzte sein, das in der Ausführungskette aufgerufen wird, nachdem alle registriert wurdenIExceptionLogger
:Mehr dazu hier .
quelle
Möglicherweise sind Try-Catch-Blöcke vorhanden, die Ihnen nicht bekannt sind.
Ich dachte, meine neue
global.asax.Application_Error
Methode würde nicht konsequent für nicht behandelte Ausnahmen in unserem Legacy-Code aufgerufen.Dann fand ich in der Mitte des Aufrufstapels einige Try-Catch-Blöcke mit dem Namen Response.Write on the Exception-Text. Das war's. Wirf den Text auf den Bildschirm und tötete die Ausnahme steinertot.
Die Ausnahmen wurden also behandelt, aber die Behandlung war nicht nützlich. Nachdem ich diese Try-Catch-Blöcke entfernt hatte, wurden die Ausnahmen erwartungsgemäß an die Application_Error-Methode weitergegeben.
quelle