WCF-exception-handling mit IErrorHandler
Ich bin grundsätzlich der Umsetzung der IErrorHandler
Schnittstelle zu fangen alle Arten von Ausnahmen von der WCF-Dienst und sendet Sie an den client durch die Umsetzung der ProvideFault
Methode.
Stehe ich vor einem entscheidenden Problem jedoch. Alle exceptions werden an den client gesendet als FaultException
aber dies deaktiviert den client zum Umgang mit bestimmten Ausnahmen, die kann er haben den im service.
Betrachten: SomeException
definiert wurde und geworfen in eine der OperationContract
Implementierungen. Wenn die exception geworfen wird, seine umgewandelt, um einen Fehler mit dem folgenden code:
var faultException = new FaultException(error.Message);
MessageFault messageFault = faultException.CreateMessageFault();
fault = Message.CreateMessage(version, messageFault, faultException.Action);
Dieser sendet den Fehler als string, aber der Kunde hat zu fangen, eine Allgemeine Ausnahme wie:
try{...}
catch(Exception e){...}
und nicht:
try{...}
catch(SomeException e){...}
Nicht nur benutzerdefinierte Ausnahmen wie SomeException, aber system-Ausnahmen wie InvalidOperationException kann nicht gefangen werden mit dem oben beschriebenen Vorgang.
Irgendwelche Ideen auf, wie um dieses Verhalten zu implementieren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In WCF wünschenswert, die Verwendung von speziellen Ausnahmen beschrieben, wie Verträge, weil Ihr Kunde kann nicht sein .NET-Anwendung, die Informationen über standard .NET Ausnahmen.
Für diese definieren Sie die
FaultContract
in der Sie Ihren Dienst und verwenden Sie dann die FaultException Klasse.SERVER-SEITE
Darüber hinaus können Sie in der Konfigurations-Datei, die der server liefert exception-details im FaultExceptions, aber dies wird nicht empfohlen, in einer Produktion Anwendung:
Danach, Sie können schreiben Sie Ihre Methode für die Behandlung von Ausnahmen:
CLIENT:
Dieser Artikel könnte helfen:
http://www.olegsych.com/2008/07/simplifying-wcf-using-exceptions-as-faults/
Ansatz, den ich verwendet habe, mit einigem Erfolg, wenn ich nicht wollte, um die Ausnahmen aufgelistet, die vielleicht geworfen werden ist das erstellen einer PassthroughExceptionHandlingBehavior Klasse, die eine IErrorHandler Verhalten für die server-Seite und IClientMessageInspector für die client-Seite. Die IErrorHandler Verhalten serialisiert die Ausnahme in der Fehler Meldung. Die IClientMessageInspector deserialisiert und wirft die Ausnahme.
Befestigen Sie dieses Verhalten sowohl für den WCF-client und WCF-server. Können Sie das Verhalten über die config-Datei oder durch anwenden der [PassthroughExceptionHandlingBehavior] - Attribut zu Ihrem Vertrag.
Hier ist das Verhalten der Klasse:
ClientBase<TChannel>
Umsetzung, sondern um die service-level, ist dies möglich?FaultException hat eine Code-Eigenschaft, die Sie verwenden können, fore-exception-handling.