–
|
Hola, después de mucho tiempo sin escribir debido a vacaciones, trabajo agobiante, prepararme para mi otra afición (correr)…, me he propuesto volver a escribir en el blog, quizás no con tanta periodicidad como antes pero no olvidarme de el.
Para este primer articulo después del kitkat, voy a hablar de un problema que he tenido recientemente. La aplicación que estamos desarrollando es muy consumidora de servicios web de Java servidos por WebLogic 8. Recientemente la parte de WebLogic ha hecho una migración de la versión 8 a la 11 y han activado la multireferencia para los servicios Web (Consultar http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383520), esto modificaba el mensaje SOAP devuelto por WebLogic (no puedo poner ninguno de ejemplo por confidencialidad) la teoría dice que no debía de afectar a los clientes porque era estándar. <xsd:int id="ID_7" xsi:type="xsd:int">62</xsd:int> <xsd:int id="ID_73" xsi:type="xsd:int">104</xsd:int> A la hora de deserializar WCF no devolvía ningún error sino que el valor de esos campos eran siempre 0. WCF también implementa multireferencia y es capaz de deserializarla pero los mensajes SOAP que se generan son diferentes a los que generaba WebLogic 11. La solución que encontré fue crear un behavior de WCF para el cliente, para crear un behavior os recomiendo que leáis esta entrada de Juanlu http://geeks.ms/blogs/jlguerrero/archive/2008/12/07/wcf-un-behavior-para-personalizar-cabeceras-http.aspx que indica como crear un behavior de WCF que personaliza las cabeceras SOAP para todos los mensajes enviados por el cliente. Si os fijáis en el código del behavior el codifica el método BeforeSendRequest en el que puedes modificar el mensaje que envía el cliente al servidor, pero en este caso queríamos modificar lo que recibíamos del servidor para crear un mensaje SOAP que .NET podía deserializar, para ello debemos de codificar el método AfterReceiveReply , este método tiene un parámetro (reply) que es el mensaje enviado por el servidor, pero para tratarlo debemos de realizar unos cuantos pasos, primero debemos de saber que este mensaje puede ser leído solo una vez, si intentas leerlo una segunda vez te da una bonita excepción. El primer paso es convertir este mensaje a un XmlDocument para poder tratarlo, el código seria el siguiente
Una vez que lo tenemos en formato XmlDocument, lo podemos tratar para cambiar las referencias de href por los valores correspondientes de manera que el servicio pudiera deserializarlos
Una vez que tenemos el XMLDocument cambiado, la manera de asignarlo a la variable reply es a través de XMLReader,para ello transformamos el XMLDocument a XMLReader
De esta manera hemos cambiado el mensaje SOAP adaptándolo a nuestras necesidades Libros recomendados para este tema |
Resources like the one you mentioned here will be very useful to me! I will post a link to this page on my blog. I am sure my visitors will find that very useful