¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Problema con Webservice .NET: Error de validación al consumir servicio SOAP con objetos anidados

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 35 Vistas
0
Cargando...

Hello, estoy usando PB 12.1 6639 / Win 7 64


Hoy tengo un problema consumiendo un webservice usando el motor .NET.


Las definiciones correspondientes de WSDL y XSD se pueden encontrar aquí:


https://finanzonline.bmf.gv.at/fonws/ws/regKasseService.wsdl

https://finanzonline.bmf.gv.at/fonws/ws/regKasseWs.xsd

https://finanzonline.bmf.gv.at/fonws/ws/regKasse.xsd


Intento llamar a la función rkdb y recibo una excepción con el mensaje de error corto 'Error de validación'.


Para obtener información más detallada, utilicé Fiddler para ver el sobre SOAP producido. Por favor, consulte el archivo adjunto para ver el mensaje SOAP.


Desde esto puedo ver que el mensaje SOAP no contiene toda la información de los parámetros que le paso.

Echa un vistazo al código que uso para llamar al webservice:

// *** Inicio del código ***

rkdbrequest l_request

rkdbresponse l_response

registrierung_kasse l_kasse

try l_request = create rkdbrequest

l_request.tid = "ws_account"

l_request.benid = "ws_user1"

l_request.id = "xau390xkie234AAb"

l_request.erzwinge_asynchron = false

l_request.erzwinge_asynchronspecified = true

l_request.art_uebermittlung = 0

l_kasse = create registrierung_kasse

l_kasse.satznr = as_satznr

l_kasse.kundeninfo = "John Doe"

l_kasse.kassenidentifikationsnummer = "1"

l_kasse.anmerkung = "Caja 1"

l_kasse.benutzerschluessel = "xe45...66==" // Clave AES (codificada en Base64)

l_request.ws_rkdb = create rkdb

l_request.ws_rkdb.ts_erstellung = datetime(today(), now())

l_request.ws_rkdb.items[1] = l_kasse

l_response = l_rkdbservice.rkdb(l_request) // Llamada al WS para rkdb()

catch (soapexception e1)

Messagebox("e1", "Error durante la ejecución de la función del webservice '" + ls_function + "' (Soapexception: '" + e1.text + "')!")

exit

end try

// *** Fin del código ***

Como puedes ver, toda la información se pasa en un objeto (l_request), que contiene un array de any's (llamado 'items') en el miembro 'l_request.ws_rkdb'. Asigno el objeto 'l_kasse' al primer ítem del array de items. Ahora toda la información de 'l_kasse' falta en el mensaje SOAP.

En modo de depuración puedo ver que todos los objetos se crean correctamente y se llenan con los valores correctos. También adjunté una imagen de los tipos de webservice importados (nvo's).

¡Realmente espero que alguien pueda ayudarme a encontrar el error! Gracias de antemano

Saludos, Martin

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Martin;

Si la corazonada de Bruce es correcta y el tipo de datos ANY es en realidad una Clase .Net - no hay nada que puedas hacer al respecto en PB ya que solo admite tipos de datos C estándar. De manera similar, lo mismo sería cierto si el autor del servicio web escribió el servicio en Java y devolvió una Clase Java como tipo de datos any. Tu aplicación PB estaría en la misma situación.

Sería prudente contactar al autor del servicio web y obtener una mejor descripción de qué elementos de datos se están pasando realmente desde el WS. Si de hecho, están utilizando una Clase Have o .Net ... entonces otro enfoque podría ser:

1) crear un ensamblado .net en VS para intermediar la interacción con el WS.

2) crear una aplicación Java e instanciarla desde tu aplicación PB usando el método CreateJVM() para intermediar la comunicación con el WS.

3) crear tu propio WS para intermediar la comunicación con el WS que necesitas. Luego llamar al WS intermediario desde tu aplicación PB.

Saludos ... Chris

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

El fondo para cualquier tipo de dato es el hecho de que hay varias llamadas posibles diferentes a la misma función del servicio web (me refiero a que el array de elementos any items[] no solo puede llenarse con objetos de tipo Registrierung_kasse, sino también con otros tipos). El servicio web entonces realiza diferentes acciones, dependiendo del tipo.

Mi primera idea sobre esto es crear los parámetros nvo manualmente, uno por objeto en item[] y definir item[] no como any, sino como el tipo apropiado).

Luego puedo usar el tipo específico para llamar al servicio web.

Voy a intentarlo, ¿crees que esta es la forma adecuada?

No creo que pueda realizar una modificación por parte del proveedor (gobierno/fiscal) ...

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Si ves tipos de propiedad de cualquier tipo, puede indicar que quien escribió el servicio está utilizando tipos de datos específicos de la plataforma (es decir, tipos de datos .Net). Es posible que necesites comunicarte con el proveedor del servicio para solicitar que utilicen tipos de datos agnósticos de la plataforma para el servicio.

Ver el error número uno en lo siguiente: Amol Kulkarni: Techno-Domain: Los 5 errores más comunes en los servicios web…revisitados

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Sospecho que el problema está en la propiedad de los elementos de tipo any. Debería ser de tipo registrierumg_kasse. De esta manera, el motor sabrá cómo generar las declaraciones XML adecuadas. Tal vez puedas cambiarlo con el editor de código fuente o modificar el archivo wsdl antes de importar la definición. Por cierto, ¿cómo está definida la propiedad de los elementos en el archivo wsdl/fuente?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?