.NET WCF-Fehler erzeugen falsche SOAP 1.1 faultcode Werte
Ich bin mit dem Experimentieren mit der FaultException und FaultException<T>, um zu bestimmen, die beste Nutzung Muster in unseren Anwendungen. Wir brauchen, um Unterstützung für WCF-als auch nicht-WCF-Dienst der Verbraucher/Kunden, einschließlich SOAP 1.1 und SOAP 1.2-clients.
FYI: mit FaultExceptions mit wsHttpBinding Ergebnisse in SOAP 1.2 Semantik in der Erwägung, dass mit FaultExceptions mit basicHttpBinding Ergebnisse in SOAP 1.1 Semantik.
Ich bin mit dem folgenden code zu werfen, eine FaultException<FaultDetails>:
throw new FaultException<FaultDetails>(
new FaultDetails("Throwing FaultException<FaultDetails>."),
new FaultReason("Testing fault exceptions."),
FaultCode.CreateSenderFaultCode(new FaultCode("MySubFaultCode"))
);
Den FaultDetails Klasse ist nur eine einfache test-Klasse, die einen string enthält "Message" - Eigenschaft, wie Sie unten sehen können.
Bei der Verwendung von wsHttpBinding die Antwort 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>
Das sieht richtig nach SOAP 1.2 Spezifikationen. Das Haupt - /root "- Code" ist "Sender", der eine "Subcode" von "MySubFaultCode". Wenn der service-consumer/client mit WCF die FaultException auf der client-Seite imitiert auch die gleiche Struktur, mit der faultException.Code.Namen als "Absender" und faultException.Code.SubCode.- Name, "MySubFaultCode".
Bei der Verwendung von "basicHttpBinding" die Antwort 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>
Diese sieht nicht Recht. Blick auf die SOAP 1.1-Spezifikationen, ich hatte erwartet, um zu sehen, die "faultcode" haben einen Wert von "s:Client.MySubFaultCode" wenn ich FaultCode.CreateSenderFaultCode(new FaultCode("MySubFaultCode")). Auch einen WCF-client bekommt eine falsche Struktur. Die faultException.Code.Name ist "MySubFaultCode" statt "Sender", und die faultException.Code.SubCode wird null anstelle von faultException.Code.SubCode.- Name, "MySubFaultCode". Auch die faultException.Code.IsSenderFault ist falsch.
Ähnliches problem bei der Verwendung von FaultCode.CreateReceiverFaultCode(new FaultCode("MySubFaultCode")):
- funktioniert wie erwartet für SOAP 1.2
- erzeugt "s:MySubFaultCode" anstelle von "s:Server.MySubFaultCode" und die faultException.Code.IsReceiverFault false für SOAP 1.1
Dieser Artikel wurde veröffentlicht von jemand anderem auf http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=669420&SiteID=1 in den Jahren 2006 und niemand hat geantwortet. Ich finde es sehr schwer zu glauben, dass niemand in dieser, noch.
Ist hier jemand anderes mit einem ähnlichen problem: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3883110&SiteID=1&mode=1
Microsoft Connect bug: https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=367963
Beschreibung, wie der Fehler sollte funktionieren: http://blogs.msdn.com/drnick/archive/2006/12/19/creating-faults-part-3.aspx
Mache ich etwas falsch oder ist das wirklich ein bug im WCF?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist mein Aktueller workaround:
Leider sehe ich keine Möglichkeit zur Verwendung von subcodes, ohne zu brechen entweder SOAP 1.1 oder 1.2-clients.
Wenn Sie den Code verwenden.SubCode-syntax können Sie erstellen, SOAP 1.1-kompatibel faultcode Werte, aber es bricht SOAP 1.2.
Wenn Sie die richtige subcode-Unterstützung .NET (entweder über die statische FaultCode Methoden oder eine der überladungen) es bricht SOAP 1.1, arbeitet aber in SOAP 1.2.
Antwort von Microsoft:
Diskutiert, wie in http://msdn.microsoft.com/en-us/library/ms789039.aspx, gibt es zwei Methoden beschrieben, die in der Soap 1.1-Spezifikation für die benutzerdefinierte Fehlercodes:
(1) Mit der "dot" - notation, wie Sie Sie beschreiben,
(2) die Definition komplett neue Fehlercodes
Leider, die "dot" - notation sollte vermieden werden, da es die Verwendung wird abgeraten in die WS-I Basic Profile-Spezifikation. Im wesentlichen bedeutet dies, dass es keine echte Entsprechung der Soap 1.2-Fehler-SubCode-bei Verwendung von Soap 1.1.
So, bei der Generierung Fehler, müssen Sie in Kenntnis der MessageVersion definiert in der Bindung, und generieren faultcodes entsprechend.
Da "sender" und "Empfänger" sind nicht gültig Fehler-codes für Soap 1.1, und es gibt kein wirkliches äquivalent für einen Fehler-subcode, sollten Sie nicht verwenden die CreateSenderFaultCode und CreateReceiverFaultCode Methoden bei der Generierung von benutzerdefinierten Fehlercodes für Soap 1.1.
Stattdessen müssen Sie definieren Ihre eigenen faultcode, mit Ihren eigenen namespace und name:
FaultCode customFaultCode = new FaultCode(localName, faultNamespace);