¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Problema com Webservice .NET: Erro de validação ao consumir serviço SOAP com objetos aninhados

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

Olá, estou usando PB 12.1 6639 / Win 7 64


Hoje estou enfrentando um problema ao consumir um webservice usando o motor .NET.


As definições correspondentes de WSDL e XSD podem ser encontradas aqui:


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


Estou tentando chamar a função rkdb e recebo uma exceção com a mensagem de erro curta 'Erro de validação'.


Para obter informações mais detalhadas, usei o Fiddler para ver o envelope SOAP produzido. Por favor, consulte o arquivo anexado para ver a mensagem SOAP.


A partir disso, posso ver que a mensagem SOAP não contém todas as informações dos parâmetros que estou passando.

Dê uma olhada no código que estou usando para chamar o webservice:

// *** Início do 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==" // Chave AES (codificada em 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) // Chamada ao WS para rkdb()

catch (soapexception e1)

Messagebox("e1", "Erro durante a execução da função do webservice '" + ls_function + "' (Soapexception: '" + e1.text + "')!")

exit

end try

// *** Fim do código ***

Como você pode ver, todas as informações são passadas em um objeto (l_request), que contém um array de any's (chamado 'items') no membro 'l_request.ws_rkdb'. Atribuo o objeto 'l_kasse' ao primeiro item do array de items. Agora, todas as informações de 'l_kasse' estão faltando na mensagem SOAP.

Em modo de depuração, consigo ver que todos os objetos são criados corretamente e preenchidos com os valores corretos. Também anexei uma imagem dos tipos de webservice importados (nvo's).

Espero sinceramente que alguém possa me ajudar a encontrar o erro! Obrigado antecipadamente

Saudações, Martin

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

4 Respuestas

0
Cargando...

Olá Martin;

Se a intuição de Bruce estiver correta e o tipo de dados ANY for na verdade uma Classe .Net - não há nada que você possa fazer sobre isso no PB, já que ele suporta apenas tipos de dados C padrão. Da mesma forma, o mesmo seria verdade se o autor do serviço web escreveu o serviço em Java e retornou uma Classe Java como tipo de dados any. Sua aplicação PB estaria na mesma situação.

Seria prudente entrar em contato com o autor do serviço web e obter uma descrição mais precisa dos elementos de dados que estão sendo realmente passados do WS. Se realmente estiverem usando uma Classe Java ou .Net ... então outra abordagem poderia ser:

1) criar um assembly .net no VS para intermediar a interação com o WS.

2) criar um aplicativo Java e instanciá-lo a partir de sua aplicação PB usando o método CreateJVM() para intermediar a comunicação com o WS.

3) criar seu próprio WS para intermediar a comunicação com o WS que você precisa. Em seguida, chame o WS intermediário de sua aplicação PB.

Saudações ... Chris

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

O fundamento para qualquer tipo de dado é o fato de que existem várias chamadas possíveis diferentes para a mesma função do serviço web (refiro-me ao array de elementos any items[] que não só pode ser preenchido com objetos do tipo Registrierung_kasse, mas também com outros tipos). O serviço web então executa ações diferentes, dependendo do tipo.

Minha primeira ideia sobre isso é criar os parâmetros nvo manualmente, um por objeto em item[] e definir item[] não como any, mas como o tipo apropriado).

Então posso usar o tipo específico para chamar o serviço web.

Vou tentar, você acha que esta é a forma correta?

Não acredito que possa fazer uma modificação por parte do fornecedor (governo/fiscal) ...

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

Se você vir tipos de propriedade de qualquer tipo, pode indicar que quem escreveu o serviço está utilizando tipos de dados específicos da plataforma (ou seja, tipos de dados .Net). Pode ser necessário entrar em contato com o provedor de serviços para solicitar que utilizem tipos de dados agnósticos da plataforma para o serviço.

Veja o erro número um no seguinte link: Amol Kulkarni: Techno-Domain: Os 5 erros mais comuns nos serviços web revisitados

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

Suspeito que o problema esteja na propriedade dos elementos do tipo any. Deveria ser do tipo registrierumg_kasse. Dessa forma, o mecanismo saberá como gerar as declarações XML adequadas. Talvez você possa alterá-lo com o editor de código-fonte ou modificar o arquivo wsdl antes de importar a definição. Aliás, como está definida a propriedade dos elementos no arquivo wsdl/fonte?

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?