Estoy experimentando con el uso de FaultException y FaultException <T> para determinar el mejor patrón de uso en nuestras aplicaciones. Necesitamos apoyar a WCF así como a consumidores/clientes que no pertenecen a WCF, incluidos los clientes SOAP 1.1 y SOAP 1.2..NET Fallos WCF que generan valores de código de error SOAP 1.1 incorrectos
FYI: el uso de FaultExceptions con wsHttpBinding da como resultado la semántica de SOAP 1.2 mientras que el uso de FaultExceptions con basicHttpBinding da como resultado la semántica de SOAP 1.1.
estoy usando el siguiente código para lanzar una FaultException <FaultDetails>:
throw new FaultException<FaultDetails>(
new FaultDetails("Throwing FaultException<FaultDetails>."),
new FaultReason("Testing fault exceptions."),
FaultCode.CreateSenderFaultCode(new FaultCode("MySubFaultCode"))
);
La clase FaultDetails es sólo una clase de prueba simple que contiene una cadena de propiedad "mensaje" como se puede ver a continuación.
Al utilizar wsHttpBinding la respuesta es:
<?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>
Esto se ve bien de acuerdo con el SOAP 1.2 especificaciones. El "Código" principal/raíz es "Remitente", que tiene un "Subcódigo" de "MySubFaultCode". Si el consumidor/cliente del servicio utiliza WCF, FaultException en el lado del cliente también imita la misma estructura, con faultException.Code.Name como "Sender" y faultException.Code.SubCode.Name como "MySubFaultCode".
Al utilizar basicHttpBinding la respuesta es:
<?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>
Esto no se ve bien. En cuanto a las especificaciones de SOAP 1.1, esperaba ver el "código de falla" para tener un valor de "s: Client.MySubFaultCode" cuando uso FaultCode.CreateSenderFaultCode (new FaultCode ("MySubFaultCode")). También un cliente WCF obtiene una estructura incorrecta. El faultException.Code.Name es "MySubFaultCode" en lugar de ser "Sender", y el faultException.Code.SubCode es nulo en lugar de faultException.Code.SubCode.Name que es "MySubFaultCode". Además, faultException.Code.IsSenderFault es falso.
problema similar cuando se utiliza FaultCode.CreateReceiverFaultCode (nueva FaultCode ("MySubFaultCode")):
- funciona como se espera para SOAP 1.2
- genera “s: MySubFaultCode” en lugar de “s: Server.MySubFaultCode ”y el faultException.Code.IsReceiverFault es falsa para SOAP 1,1
Este artículo también fue publicado por otra persona en http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=669420&SiteID=1 en 2006 y nadie ha respondido. Me resulta muy difícil creer que nadie se ha encontrado con esto, todavía.
Aquí está otra persona teniendo un problema similar: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3883110&SiteID=1&mode=1
Microsoft Connect error: https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=367963
Descripción de cómo los fallos deben trabajar: http://blogs.msdn.com/drnick/archive/2006/12/19/creating-faults-part-3.aspx
estoy haciendo algo mal o se trata realmente de un error en WCF?