2009-10-05 5 views
5

Ich konvertiere Code von ASMX zu WCF. In meinem ASMX Web Service werfe ich wie SOAP Ausnahmen zurück:Welcher Ausnahmetyp sollte mit einem WCF-Dienst ausgelöst werden?

if (ex.InnerException != null) 
       { 
        SoapException se = new SoapException(ex.Message, SoapException.ServerFaultCode, Context.Request.Url.AbsoluteUri, ex.InnerException); 
        throw se; 
       } 

Welche Ausnahmen soll ich zu WCF-Clients ruft meinen Dienst zurückwerfen? Ich schätze den SOAP außer ist die falsche Art, weil der Testklient es nicht als ein gültiger Fehler sieht und gerade sagt - interner Fehler ist im Webservice aufgetreten.

Antwort

20

In einem WCF-Dienst ist es am besten, wenn Sie nur FaultException (oder FaultException<T>) werfen.

Dies liegt an zwei Dingen: Da WCF interoperabel ist (Ihr Client könnte leicht eine Nicht-.NET-App sein), sollten Sie keine .NET-Ausnahmen verwenden, da diese zu plattformspezifisch sind. Und zwei: Wenn Sie FaultExceptions (die in SOAP-Fehler übersetzt werden) verwenden, wird Ihr Kanal (die Verbindung zwischen Client und Server) nicht abgerissen oder "fehlerhaft". Die WCF-Laufzeit auf der Serverseite behandelt alle nicht behandelten .NET-Ausnahmen als "schwerwiegende" Ausnahmen und versetzt den Kanal in einen fehlerhaften Zustand, vorausgesetzt, dass etwas wirklich Schlimmes passiert ist.

Wenn dein Kanal fehlerhaft ist, kannst du es nicht mehr verwenden - du musst deinen Client-Proxy schließen und neu erstellen.

Wenn Sie wollen (oder müssen) sehr interoperabel sein, würden Sie Ihre SOAP-Fehler sind Fehlerverträge (analog zum Datenverträgen) in einer separaten Datei definieren und dann würden Sie FaultException<T> werfen, wo T wäre einer deiner Schuldverträge. Wenn Sie auf beiden Seiten ausschließlich .NET sind, können Sie auch .NET-Ausnahmen in FaultException als generischen Typ T festhalten, wenn Sie möchten - der Kanal wird nicht fehlerhaft sein (z. B. könnten Sie einen FaultException<InvalidOperationException> werfen und somit zurücksenden, was passierte falsch).

+1

Eine großartige Erklärung, ich wünschte, ich könnte zweimal upvote. Vielen Dank. – Noich

3

In WCF verwenden Sie FaultException. Siehe zum Beispiel here.

+0

+1 für das Teilen eines hervorragenden Beispiels. – SBirthare

Verwandte Themen