.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&lt;FaultDetails&gt;.</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&lt;FaultDetails&gt;.</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?

InformationsquelleAutor wojo | 2008-09-15
Schreibe einen Kommentar