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).
Eine großartige Erklärung, ich wünschte, ich könnte zweimal upvote. Vielen Dank. – Noich