Ошибка клиента WCF .Net 4.0 при десериализации тела ответного сообщения

Я пытаюсь заставить клиент WCF .Net 4.0 работать с веб-службой NuSOAP / 0.7.2 (1.94). Во-первых, веб-служба не основана на текущих стандартах SOA, поэтому мне пришлось создать собственный кодировщик для обработки кодировки сообщений ISO-8859-1. Когда я получаю ответ, WCF выдает следующее исключение

«Ошибка десериализации тела ответного сообщения»

Когда я смотрю на тело SOAP, я вижу <SOAP-ENV:Body>... stream ...</SOAP-ENV:Body>

Кто-нибудь сталкивался с этой ошибкой? Мы будем благодарны за любые отзывы или указания в правильном направлении. Это моя первая служба WCF для "не" WCF.

ApplicationData
TraceData
<DataItem>
<MessageLogTraceRecord Time="2010-07-14T19:14:36.4832868-07:00" Source="TransportReceive" Type="System.ServiceModel.Channels.StreamedMessage" xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
<HttpResponse>
<StatusCode>OK</StatusCode>
<StatusDescription>OK</StatusDescription>
<WebHeaders>
<X-SOAP-Server>NuSOAP/0.7.2 (1.94)</X-SOAP-Server>
<Content-Encoding></Content-Encoding>
<Content-Length>496</Content-Length>
<Content-Type>text/xml; charset=ISO-8859-1</Content-Type>
<Date>Thu, 15 Jul 2010 02:14:36 GMT</Date>
<Server>Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7a PHP/4.3.11</Server>
<X-Powered-By>PHP/4.3.11</X-Powered-By>
</WebHeaders>
</HttpResponse>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="https://www.datatranswebedi.com/soapv2/">
<SOAP-ENV:Header></SOAP-ENV:Header>
<SOAP-ENV:Body>... stream ...</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
</MessageLogTraceRecord>
</DataItem>
</TraceData>
</ApplicationData>

Заранее спасибо, Бреннан


person Brennan Mann    schedule 20.07.2010    source источник


Ответы (2)


Оказывается, произошла ошибка десериализации даты, потому что она была в неправильном формате. Я обнаружил ошибку при включении режима отладки «Подробный» в клиенте WCF.

System.InvalidCastException: невозможно назначить объект типа System.Xml.XmlNode [] объекту типа System.DateTime.

Устаревшая веб-служба возвращала «xsd: date» с датой и временем, тогда как тип данных должен был быть «xsd: dateTime».

Чтобы подтвердить, что это была причина проблемы, я запросил две записи из веб-службы и обработал XML в методе переопределения сообщения ReadMessage () и изменил автоматически сгенерированный прокси-класс. Это устранило проблему, и я знаю, что это не окончательное решение. Прежде чем я свяжусь с автором устаревшей веб-службы, есть ли у кого-нибудь комментарии по поводу даты и формата даты и времени в Soap?

Maybe the following date is valid in Soap Version 1.1 with ISO-8859-1 encoding:

<date xsi:type="xsd:date">2010-05-02 08:03:45</date>

 If it is, is this an issue using a custom encoder or was it really the date type/format in the soap body? Microsoft only accepted that date in the following format:

<date xsi:type="xsd:dateTime">2010-05-02T08:03:45</date>


    <customBinding>
      <binding name="ISO8859Binding">
        <customTextMessageEncoding messageVersion="Soap11" encoding="ISO-8859-1" mediaType="text/xml"  />
        <httpsTransport />
      </binding>
      </customBinding>

public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string contentType)
{

    XmlReader reader = XmlReader.Create(stream);
    XmlDocument doc = new XmlDocument();

    // Log to a file.
    StreamWriter sw = new StreamWriter(@"C:\dump2.txt");

    doc.Load(reader);
    doc.InnerXml = doc.InnerXml.Replace("xsd:date", "xsd:dateTime");
    doc.InnerXml = doc.InnerXml.Replace("2010-05-02 08:03:45", "2010-05-02T08:03:45");
    doc.InnerXml = doc.InnerXml.Replace("2010-05-02 12:38:06", "2010-05-02T12:38:06");

    sw.WriteLine(doc.InnerXml);
    sw.Flush();
    sw.Close();

    byte[] buffer = System.Text.Encoding.Default.GetBytes(doc.InnerXml);
    Stream test = new MemoryStream(buffer);
    XmlReader reader2 = XmlReader.Create(test);

    return Message.CreateMessage(reader2, maxSizeOfHeaders, this.MessageVersion);

}

Еще раз спасибо, Бреннан

person Brennan Mann    schedule 26.07.2010

Мне пришлось сделать то же самое (против другого веб-сервиса устаревшего типа), и сначала я столкнулся с проблемами.

Я наткнулся на эту отличную запись в блоге WCF: кодирование текстовых сообщений и кодирование ISO-8859-1, в котором описаны некоторые подводные камни при реализации настраиваемого кодировщика текста для WCF - может быть, это будет полезно для вас?

Также ознакомьтесь с предыдущим вопросом Stackoverflow по той же теме:

Вызов веб-службы, использующей ISO-8859-1 кодировка из WCF

person marc_s    schedule 20.07.2010