2010-07-20 14 views
1

Je tente d'obtenir un client WCF .Net 4.0 pour fonctionner avec un service Web NuSOAP/0.7.2 (1.94). Tout d'abord, le service Web n'est pas basé sur les normes SOA actuelles, j'ai donc dû créer un encodeur personnalisé pour gérer le codage des messages ISO-8859-1. Quand je reçois la réponse, WCF jette l'exception suivanteWCF .Net 4.0 Erreur client dans la désérialisation du corps du message de réponse

« Erreur dans le corps désérialisation du message de réponse »

Lorsque l'on regarde le corps SOAP, je vois <SOAP-ENV:Body>... stream ...</SOAP-ENV:Body>

Quelqu'un at-il rencontré cette erreur? Toute rétroaction ou un point dans la bonne direction serait grandement appréciée. Ceci est mon premier WCF à "non" service 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> 

Merci à l'avance, Brennan

Répondre

2

Il se il y avait une erreur dans la date désérialisation parce qu'il n'a pas été dans le bon format. J'ai attrapé l'erreur en activant le mode de débogage "Verbose" dans le client WCF.

System.InvalidCastException: Impossible d'affecter un objet de type System.Xml.XmlNode [] à un objet de type System.DateTime.

Le service Web hérité renvoyait "xsd: date" avec une date et une heure lorsque le type de données devait être "xsd: dateTime". Pour confirmer cela était la cause du problème, j'ai demandé deux enregistrements à partir du service Web et manipulé le XML dans la méthode Message ReadMessage() de remplacement et modifié la classe proxy générée automatiquement. Cela a corrigé le problème et je sais que ce n'est pas la solution finale. Avant de contacter l'auteur du service Web existant, est-ce que quelqu'un a des commentaires sur la date du savon et le format dateHeure?

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

} 

Merci encore, Brennan

1

je devais faire la même chose (contre un autre type de legs webservice) et je suis tombé sur des questions au début.

Je suis tombé sur cet excellent article de blog WCF: Text Message Encoding and ISO-8859-1 Encoding qui décrit quelques pièges lors de la mise en œuvre d'un encodeur de texte personnalisé pour WCF - peut-être que cela vous sera utile?

Consultez également une question précédente Stackoverflow sur le même sujet:

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