La désérialisation de détail de message SOAP
Je suis en train de travailler sur une application du Windows Store.
J'ai le texte suivant créées manuellement la Faute de la classe:
[XmlRoot(Namespace = "http://schemas.xmlsoap.org/soap/envelope/", ElementName = "Fault")]
public partial class SoapFault
{
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "faultcode")]
public String FaultCode { get; set; }
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "faultstring")]
public String FaultDescription { get; set; }
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "detail")]
public InnerException[] Detail { get; set; }
}
[XmlType(Namespace = "http://my.namespace.com", TypeName = "InnerException")]
public partial class InnerException
{
[XmlElement(Form = XmlSchemaForm.Unqualified, ElementName = "message")]
public String Message { get; set; }
}
C'est la réponse du serveur, je suis en train de lire:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><env:Fault><faultcode>env:Server</faultcode><faultstring>internal error</faultstring><detail><ns2:InnerException xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ns1.my.namespace.com" xmlns:ns2="http://my.namespace.com" xmlns:ns3="http://ns3.my.namespace.com"><message>internal error</message></ns2:InnerException ></detail></env:Fault></env:Body></env:Envelope>
La façon dont je suis en train de lire, il est comme suit:
using (XmlReader reader = XmlReader.Create(await response.Content.ReadAsStreamAsync()))
{
string SoapNamespace = "http://schemas.xmlsoap.org/soap/envelope/";
try
{
var serializer = new XmlSerializer(typeof(SoapFault));
reader.ReadStartElement("Envelope", SoapNamespace);
reader.ReadStartElement("Body", SoapNamespace);
var fault = serializer.Deserialize(reader) as SoapFault;
reader.ReadEndElement();
reader.ReadEndElement();
}
catch(Exception ex)
{
throw new Exception("Exception was thrown:" + ex.Message);
}
}
J'ai essayé d'ajouter des espaces de noms, changer la XmlElement Attributs, mais je finis toujours avec le Détail de la propriété dans le type soapfault être NULL. Quand j'ai changer le type d'objet, j'ai au moins obtenir un XmlNode ensemble qui contient les données.
Que dois-je changer dans ce code pour obtenir la bonne classe instanciée sur la sérialisation?
Note: je suis malheureusement obligé de créer les appels à la main et ne peut pas utiliser du code généré automatiquement.
OriginalL'auteur UrbanEsc | 2012-10-12
Vous devez vous connecter pour publier un commentaire.
Fortement inspiré par Comment Désérialiser document XML, je pense que cela devrait faire l'affaire.
J'ai généré la classe comme suit:
Ce qui a entraîné l':
Oui, il est généré automatiquement, mais j'ai pensé que ce serait la façon la plus simple de créer une classe que vous seriez en mesure de désérialiser. Qui vous pouvez faire comme ceci:
Qui correctement pris le
Detail
de la propriété. Dans votre cas, vous devrez utiliser leXmlReader
comme vous le faisiez avant à la place de monnew StringReader(document.OuterXml)
, et l'envelopper dans un bloc using, etc.Gardez à l'esprit que certains des noms de propriétés de l'objet désérialisé ne correspond pas exactement à ce que vous aviez dans votre
SoapFault
classe (il s'appelle maintenantEnvelope
, par exemple), et certaines de ces propriétés sont exprimées sous la forme de tableaux plutôt que des objets uniques, mais vous pourriez probablement ajuster le Xsd pour répondre en cas de besoin.Vous êtes sauvé la vie
OriginalL'auteur nick_w