2010-07-20 1 views
1

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

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

Когда смотрит на тело 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> 

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

ответ

2

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

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

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

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

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); 

} 

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

1

Я должен был сделать то же самое (против другого типа наследство WebService), и я столкнулся с вопросами в первую очередь.

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

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

Calling a webservice that uses ISO-8859-1 encoding from WCF

Смежные вопросы