Я работаю над приложением Windows Store.Deserializing detail сообщения SOAP
У меня есть следующий создан вручную Класс ошибки:
[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; }
}
Это ответ сервера я пытаюсь читать:
<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>
так, как я пытаюсь прочитать это, как следует:
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);
}
}
Я попытался добавить пространства имен, изменив атрибуты XmlElement, но я всегда заканчиваю а свойство Detail в SoapFault - NULL. Когда я меняю тип на объект, я, по крайней мере, получаю набор XmlNode, который содержит данные.
Что я должен изменить в этом коде, чтобы получить правильный экземпляр класса при сериализации?
Обратите внимание: я к несчастью вынужден создавать вызовы вручную и не могу использовать автоматически сгенерированный код.
для шага № 3 выше, если шаг № 2 сгенерировал более 2 файлов, вам может потребоваться перечислить их все как аргументы xsd, т.е. ** xsd ** * reply.xsd * * reply_app1.xsd * * reply_app2.xsd * ... и т. д. – mungflesh
Вы спасаете жизнь – Yiping