Was ist effizienter? Eine Ausnahme werfen oder einen Fehler werfen ... so wie ich es sehe ist, dass es zwei Szenarien gibt:
Eine Ausnahme ist aufgetreten und wurde abgefangen. Werfen Sie das vorhandene Exception
oder erstellen Sie ein neues FaultException
und werfen Sie das?
Ihre eigene Logik (z. B. Benutzername darf nicht leer sein) muss einen Fehler entweder als Ausnahme oder als FaultException auslösen. Welches wählen Sie?
Grundsätzlich, welcher Weg ist der beste Weg? Ich frage, weil ich mich erinnere, irgendwo über WCF Boxen oder Unboxing-Ausnahmen zu lesen und es kostet zusätzliche Ressourcen und solche wie ... also denke ich auch, welches ist der effizientere Weg?
Ausgehend von einer WSDL-Vertragsperspektive kann jede Operation höchstens eine Antwort haben. Sie können jedoch mehrere Fehlerkontrakte definieren, die einem Client im Prinzip mitteilen, dass entweder eine durch DataContractX
definierte Antwort oder eine durch FaultContractY
oder FaultContractZ
definierte Fehlerantwort erwartet wird.
Mit FaultExceptions können Sie genauer steuern, wie Ihre WSDL dargestellt wird (oder einen kompatiblen Service für eine bereits definierte WSDL schreiben).
Wenn Sie wirklich versuchen, Interoperabilität zu erreichen und wsdl und Soap voll ausnutzen, um dies zu erreichen, müssen Sie FaultExceptions verwenden. Wenn Sie WCF in einer Nur-.NET-Interaktion verwenden, können Sie Ausnahmen oder Fehlerausnahmen verwenden. Ich glaube nicht, dass der Leistungsunterschied signifikant ist (Die Kommunikation über das Netzwerk ist in der Größenordnung wichtiger als die WCF-Laufzeitumgehung von Exceptions in Generic Fehler für die Übertragung über die Leitung).
Es kann davon abhängen, wo und wie die Ausnahme behandelt werden soll. Ein Client (unabhängig von der Plattform) erhält immer eine Soap-Fehlerausnahme, unabhängig davon, ob der Dienstcode nicht behandelte Ausnahmen zulässt, der Dienst explizit eine FaultException auslöst oder die generische Version von FaultException auslöst.
Ob Sie benutzerdefinierte Fehlerausnahmen definieren möchten, um die Identifizierung bestimmter Servicebedingungen zu erleichtern, ist ein Konstruktionsrisiko. Meine Faustregel ist, nur benutzerdefinierte Fehler zu werfen, wenn ich erwarte, dass der Client alternative Logik ausführt, die von diesem benutzerdefinierten Fehler ausgelöst wird. Etwas wie Validierung ist ein grauer Bereich, weil Sie nicht wirklich wollen, dass Ihre gesamte Validierungslogik von benutzerdefinierten Fehlern gesteuert wird. Ich erstelle in der Regel einen einzelnen benutzerdefinierten Fehler, der bei der Überprüfung fehlgeschlagen ist, und er enthält all die Überprüfungsprobleme, die er als Listeneigenschaft des benutzerdefinierten Fehlers finden kann.
Das Behandeln von Ausnahmen ist immer ein kostspieliger Prozess, aber es gibt keinen wirklichen Leistungsunterschied zwischen dem Auslösen einer FaultException oder einer anderen .NET-Ausnahme auf der Dienstseite.
Nach meinem Verständnis, wenn Sie wsHttpBinding verwenden und eine .Net-Ausnahme statt einer FaultException auslöst, befindet sich der Server-Client-Kanal im fehlerhaften Zustand, und das Proxy-Klassenobjekt muss neu erstellt werden wie das vorhandene Proxy-Objekt unbrauchbar sein. Die beste Vorgehensweise könnte also die Verwendung von FaultException sein.
Wenn Sie einfach eine Exception mit 'Exception' auslösen, wird WCF-Dienst FaultExceptionin verursachen und die Grundursache der Exception wird dem Client niemals bekannt sein, es sei denn, Sie erwähnen dies
<serviceDebug includeExceptionDetailInFaults="true"/>
in web.config. Wenn Sie möchten, dass der Client die Ursache / benutzerdefinierte Nachricht hinter der Ausnahme kennt, bevorzugen Sie FaultException. Es ist eine bewährte Methode, die Ausnahme straff zu schreiben.
Tags und Links wcf exception faultexception fault