L'extraction de détail à partir d'une WCF FaultException réponse
Je suis avec succès en collaboration avec un tiers service soap. J'ai ajouté une référence de service à un web service soap qui a générés automatiquement les classes.
Lorsqu'une erreur survient, il renvoie une réponse soap comme ceci:
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring xsi:type="xsd:string">Error while reading parameters of method 'Demo'</faultstring>
<detail xsi:type="xsd:string">Invalid login or password. Connection denied.</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Je peux rattraper l'erreur, mais pas d'extraire le détail. J'ai essayé le code suivant:
catch (FaultException ex)
{
MessageFault msgFault = ex.CreateMessageFault();
var elm = msgFault.GetDetail<string>();
//throw Detail
}
Cependant il des Erreurs avec la suite que le détail de nœud n'est pas un objet:
Expecting element 'string' from namespace 'http://schemas.datacontract.org/2004/07/MyDemoNamespace'.. Encountered 'Text' with name '', namespace ''.
Ceci est la troisième partie de l'API, donc je ne peux pas changer la réponse.
OriginalL'auteur John | 2013-05-13
Vous devez vous connecter pour publier un commentaire.
Le détail nœud du message de défaut est prévu pour contenir XML. Le GetDetail sera désérialiser ce document XML dans un objet donné.
Que le contenu n'est pas XML, il est possible d'utiliser cette méthode.
Vous pouvez toutefois obtenir l'accès aux données XML et de lire les innerXml valeur:
Cette approche a fonctionné.
Résolu mon problème à la perfection!
ce code si le détail n'est pas une chaîne de caractères est ok: MessageFault msgFault = ex.CreateMessageFault(); XmlReader readerAtDetailContents = msgFault.GetReaderAtDetailContents(); var readOuterXml = readerAtDetailContents.ReadOuterXml(); var data = XElement.Parse(readOuterXml); Dictionnaire<string, string> element = données.Les éléments() .ToDictionary(elementKey => elementKey.Nom.LocalName, elementVal => elementVal.Valeur, null);
OriginalL'auteur John
OriginalL'auteur Gabriel Tame