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