Ich experimentiere mit der Verwendung von FaultException und FaultException <T>, um das beste Nutzungsmuster in unseren Anwendungen zu ermitteln. Wir müssen sowohl WCF- als auch Nicht-WCF-Service-Consumer/Clients unterstützen, einschließlich SOAP 1.1- und SOAP 1.2-Clients..NET WCF-Fehler, die falsche SOAP 1.1-Fehlercodewerte generieren
FYI: die Verwendung von FaultExceptions mit wsHttpBinding führt zu SOAP 1.2-Semantik, während die Verwendung von FaultExceptions mit basicHttpBinding zu SOAP 1.1-Semantik führt.
ich den folgenden Code verwenden < FaultDetails ein FaultException > zu werfen:
throw new FaultException<FaultDetails>(
new FaultDetails("Throwing FaultException<FaultDetails>."),
new FaultReason("Testing fault exceptions."),
FaultCode.CreateSenderFaultCode(new FaultCode("MySubFaultCode"))
);
Die FaultDetails Klasse ist nur eine einfache Test-Klasse, die eine Zeichenfolge „Nachricht“ Eigenschaft enthält, wie Sie unten sehen können.
Wenn WSHttpBinding die Antwort unter Verwendung ist:
<?xml version="1.0" encoding="utf-16"?>
<Fault xmlns="http://www.w3.org/2003/05/soap-envelope">
<Code>
<Value>Sender</Value>
<Subcode>
<Value>MySubFaultCode</Value>
</Subcode>
</Code>
<Reason>
<Text xml:lang="en-US">Testing fault exceptions.</Text>
</Reason>
<Detail>
<FaultDetails xmlns="http://schemas.datacontract.org/2004/07/ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Message>Throwing FaultException<FaultDetails>.</Message>
</FaultDetails>
</Detail>
Diese 1.2-Spezifikationen nach dem SOAP richtig aussieht. Der Haupt/root "Code" ist "Sender", der einen "Subcode" von "MySubFaultCode" hat. Wenn der Service-Consumer/Client WCF verwendet, simuliert die FaultException auf der Clientseite auch die gleiche Struktur, wobei faultException.Code.Name "Sender" und faultException.Code.SubCode.Name "MySubFaultCode" ist.
Wenn Basichttpbinding die Antwort unter Verwendung ist:
<?xml version="1.0" encoding="utf-16"?>
<s:Fault xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>s:MySubFaultCode</faultcode>
<faultstring xml:lang="en-US">Testing fault exceptions.</faultstring>
<detail>
<FaultDetails xmlns="http://schemas.datacontract.org/2004/07/ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Message>Throwing FaultException<FaultDetails>.</Message>
</FaultDetails>
</detail>
</s:Fault>
Das sieht nicht richtig aus. Bei der Betrachtung der SOAP 1.1-Spezifikationen erwartete ich, dass der "Fehlercode" den Wert "s: Client.MySubFaultCode" hat, wenn ich FaultCode.CreateSenderFaultCode (neuer FaultCode ("MySubFaultCode")) verwende. Auch ein WCF-Client erhält eine falsche Struktur. Der faultException.Code.Name ist "MySubFaultCode" anstatt "Absender" zu sein, und der faultException.Code.SubCode ist null anstelle von faultException.Code.SubCode.Name ist "MySubFaultCode". Außerdem ist faultException.Code.IsSenderFault falsch.
ähnliches Problem bei der Verwendung von FaultCode.CreateReceiverFaultCode (neu FaultCode ("MySubFaultCode")):
- Werke wie für SOAP 1.2 erwartet
- erzeugt „s: MySubFaultCode“ statt „s: Server.MySubFaultCode “und die faultException.Code.IsReceiverFault ist falsch für SOAP 1,1
Dieses Produkt wird auch von jemand anderem auf http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=669420&SiteID=1 im Jahr 2006 und niemand hat es beantwortet gebucht wurde. Ich finde es sehr schwer zu glauben, dass noch niemand darauf gestoßen ist.
Hier ist jemand anderes ein ähnliches Problem: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3883110&SiteID=1&mode=1
Microsoft Connect Fehler: https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=367963
Beschreibung, wie Störungen funktionieren sollte: http://blogs.msdn.com/drnick/archive/2006/12/19/creating-faults-part-3.aspx
Bin ich das wirklich ein Bug etwas falsch oder ist zu tun in WCF?