Jump to content


Photo

Problemas al consumir Web Services con Delphi 2010 y XE4


  • Please log in to reply
9 replies to this topic

#1 sistesc

sistesc

    Member

  • Miembros
  • PipPip
  • 13 posts

Posted 20 May 2013 - 02:02 PM

Hola a todos, tengo un problema con un Web services, estoy desarrollando un aplicación en Delphi 2010 en donde consumo un par de Web Services, utilice el "WSDL Importer" para cargar los WSDL, hasta ahi todo de maravilla, debe pasar 6 parámetros, 5 tipo string y uno tipo entero, me debe devolver un valor True o False, pero al momento de consumir el servicio me envía el siguiente mensaje: 

Unmarshalling Error: unexpected element (uri:"http://xxxxxx.xxx.xx...t",local:"arg0"). Expected elements are <{}arg5>,<{}arg4>,<{}arg3>,<{}arg2>,<{}arg1>,<{}arg0>

Lo curioso es que en la version Demo de Delphi XE4, he creado la misma aplicación y consume el Web Service sin ningún problema, leí algo acerca de las versiones de SOAP, el tipo de variables y otras cuestiones pero no logro hacerlo funcionar alguien sabe que me puede estar faltando de una versión a otra. (li)

NOTA. El Web Service trabaja correctamente, ya lo probe con SOAPUi.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 20 May 2013 - 03:13 PM

Hola sistesc bienvenido a DelphiAccess

Indudablemente es la versión de SOAP que usa D2010, puedes comparar las unidades creadas por el WSDL Importer de cada versión y ver el formato que se requiere para enviar los parámetros, tal vez sea un objeto que encapsula los 6 elementos y no una lista.

Otra cosa que te puede servir mucho es usar algun sniffer (HTTP Analyzer, por ejemplo)  para obtener el SOAP enviado por ambas versiones y comparar como se envía en XE4 en comparación con D2010.

Saludos
  • 0

#3 sistesc

sistesc

    Member

  • Miembros
  • PipPip
  • 13 posts

Posted 20 May 2013 - 04:02 PM

Revisare lo que me comentas respecto al sniffer, pero en caso de ser necesario como podría actualizar la versión de SOAP en Delphi 2010.
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 20 May 2013 - 04:29 PM

Revisare lo que me comentas respecto al sniffer, pero en caso de ser necesario como podría actualizar la versión de SOAP en Delphi 2010.


Pues según ésto http://qc.embarcader...n.aspx?rc=66864 ya está solucionado, asegurate de tener el update correspondiente que sería 14.0.3513.24210

Saludos
  • 0

#5 sistesc

sistesc

    Member

  • Miembros
  • PipPip
  • 13 posts

Posted 29 May 2013 - 10:45 AM

HOLA EGOSTAR, ya probe lo que me comentas y el problema continua igual, pidiendo apoyo a un amigo me comenta que hay que  definir los namespace a los argumentos, pero ¿como hago esto en Delphi 2010? En Delphi XE4 esto se define en la inicialización:



delphi
  1. InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg0', '', '', IS_UNQL);



Pero el método RegisterParamInfo no está implementado en Delphi 2010.

Anexo los comentarios que me enviaron:

"En Delphi XE4 se envían:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlso...soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/20...ody><UploadFile xmlns="http://www.xxxxx.com...l/LoaderPoint"><arg0 xmlns="">dlr_w32</arg0>....

En Delphi 2010 se envían:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlso...soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/20...ody><UploadFile xmlns="http://www.xxxxx.com...l/LoaderPoint"><arg0>dlr_w32</arg0>

Parece que la webservice requiere definir el namespace de los argumentos. "



  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14469 posts
  • LocationMéxico

Posted 29 May 2013 - 10:53 AM

Lo único que se me ocurre es que veas la clase que se generó en XE4 y busques el namespace arg0 y veas la diferencia con el que te creó 2010.

Como última alternativa yo lo que haría es que antes de trabajar con el XML modificar el SOAP agregando la parte de xmlns="" en cada argumento.

Saludos
  • 0

#7 sistesc

sistesc

    Member

  • Miembros
  • PipPip
  • 13 posts

Posted 30 May 2013 - 02:07 PM

Gracias agostar, el problema es que no puedo modificar XML ya que esta en un servidor de un cliente y nosotros únicamente vamos a consumir su Web Service desde nuestra aplicación que ya tenemos desarrollada, buscare por las clases o por cualquier otra forma.
  • 0

#8 sistesc

sistesc

    Member

  • Miembros
  • PipPip
  • 13 posts

Posted 30 May 2013 - 04:10 PM

Hola agostar, revisando los dos códigos (2010 y XE4) la unica diferencia que encuentro son un par de metodos que implementa en XE4 y que en 2010 no existen, el codigo en la initialization es el siguiente en Delphi 2010:



delphi
  1.   InvRegistry.RegisterInterface(TypeInfo(WSManagamentLoaderPoint), '[url=http://www.vw.com.mx/loadportal/LoaderPoint',]http://www.vw.com.mx/loadportal/LoaderPoint',[/url] 'UTF-8');
  2.   InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WSManagamentLoaderPoint), '');
  3.   InvRegistry.RegisterInvokeOptions(TypeInfo(WSManagamentLoaderPoint), ioDocument);



y Este es el codigo en Delphi XE4



delphi
  1. { WSManagamentLoaderPoint }
  2.   InvRegistry.RegisterInterface(TypeInfo(WSManagamentLoaderPoint), '[url=http://www.vw.com.mx/loadportal/LoaderPoint',]http://www.vw.com.mx/loadportal/LoaderPoint',[/url] 'UTF-8');
  3.   InvRegistry.RegisterDefaultSOAPAction(TypeInfo(WSManagamentLoaderPoint), '');
  4.   InvRegistry.RegisterInvokeOptions(TypeInfo(WSManagamentLoaderPoint), ioDocument);
  5.   { WSManagamentLoaderPoint.UploadFile }
  6.   InvRegistry.RegisterMethodInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', '',
  7.                                 '[ReturnName="return"]', IS_UNQL);
  8.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg0', '',
  9.                                 '', IS_UNQL);
  10.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg1', '',
  11.                                 '', IS_UNQL);
  12.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg2', '',
  13.                                 '', IS_UNQL);
  14.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg3', '',
  15.                                 '', IS_UNQL);
  16.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg4', '',
  17.                                 '', IS_UNQL);
  18.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg5', '',
  19.                                 '', IS_UNQL);
  20.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'return', '',
  21.                                 '', IS_UNQL);



Como veran implementa un par de metods extras, alguien sabe ¿como podría hacer esto en Delphi 2010? :cry:



delphi
  1. InvRegistry.RegisterMethodInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', '',
  2.                                 '[ReturnName="return"]', IS_UNQL);
  3.   InvRegistry.RegisterParamInfo(TypeInfo(WSManagamentLoaderPoint), 'UploadFile', 'arg0', '',
  4.                                 '', IS_UNQL);


  • 0

#9 JuanPalmaSoft

JuanPalmaSoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 76 posts
  • LocationDistrito Federal

Posted 06 June 2013 - 09:59 PM

buenas

enviame la dir para generartelo en Delphi XE2 y despues lo recomplilas en 2010 a ver que pasa, asi le hice a un web services de INDEX para el tema aduanero, pero despues lo compile en 7, y le comente las lineas que me daban problemas, y funcionó de maravillas.

mira ver ademas agragandole el ioDefault.

  • 0

#10 sistesc

sistesc

    Member

  • Miembros
  • PipPip
  • 13 posts

Posted 07 June 2013 - 09:10 AM

Hola JuanPalma, gracias por el mensaje pero ya realice esa prueba y el mismo error al ejecutarlo en 2010.

Sigo buscando solucionarlo.

Gracias.
  • 0




IP.Board spam blocked by CleanTalk.