J'expérimente l'utilisation de FaultException et FaultException <T> pour déterminer le meilleur modèle d'utilisation dans nos applications. Nous devons prendre en charge WCF ainsi que les clients/clients de services non-WCF, y compris les clients SOAP 1.1 et SOAP 1.2. FYI: l'utilisation de FaultExceptions avec wsHttpBinding aboutit à une sémantique SOAP 1.2 alors que l'utilisation de FaultExceptions avec basicHttpBinding entraîne une sémantique SOAP 1.1.Erreurs WCF .NET générant des valeurs de code d'erreur SOAP 1.1 incorrectes
J'utilise le code suivant pour lancer une FaultException <FaultDetails>:
throw new FaultException<FaultDetails>(
new FaultDetails("Throwing FaultException<FaultDetails>."),
new FaultReason("Testing fault exceptions."),
FaultCode.CreateSenderFaultCode(new FaultCode("MySubFaultCode"))
);
La classe FaultDetails est juste une classe de test simple qui contient une chaîne propriété « message » que vous pouvez voir ci-dessous.
Lorsque vous utilisez WSHttpBinding la réponse est:
<?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>
Cela ressemble à droite selon le SOAP 1.2 spécifications. Le "code" principal/racine est "Sender", qui a un "Subcode" de "MySubFaultCode". Si le consommateur de service/client utilise WCF, la FaultException du côté client imite également la même structure, avec la propriété faultException.Code.Name étant "Sender" et faultException.Code.SubCode.Name étant "MySubFaultCode".
Lorsque vous utilisez BasicHttpBinding la réponse est:
<?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>
Cela ne semble pas juste. En regardant les spécifications SOAP 1.1, je m'attendais à voir le "faultcode" avoir une valeur de "s: Client.MySubFaultCode" quand j'utilise FaultCode.CreateSenderFaultCode (new FaultCode ("MySubFaultCode")). Un client WCF obtient également une structure incorrecte. Le fichier faultException.Code.Name est "MySubFaultCode" au lieu d'être "Sender", et le fichier faultException.Code.SubCode est nul au lieu de faultException.Code.SubCode.Name étant "MySubFaultCode". En outre, le faultException.Code.IsSenderFault est faux.
problème similaire lors de l'utilisation FaultCode.CreateReceiverFaultCode (nouvelle FaultCode ("MySubFaultCode")):
- fonctionne comme prévu pour SOAP 1.2
- génère « s: MySubFaultCode » au lieu de « s: Server.MySubFaultCode » et le faultException.Code.IsReceiverFault est faux pour SOAP 1,1
Cet article a également été publié par quelqu'un d'autre sur http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=669420&SiteID=1 en 2006 et personne n'a répondu. Je trouve très difficile de croire que personne n'a encore été confronté à cela.
Voici quelqu'un qui a encore un problème similaire: 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
Description de la façon des défauts devraient fonctionner: http://blogs.msdn.com/drnick/archive/2006/12/19/creating-faults-part-3.aspx
que je fais quelque chose de mal ou est-ce vraiment un bug en WCF?