Delphi 2007 non utilizza correttamente il servizio Web JAX-WS
Domanda
Sto riscontrando un problema con Delphi 2007 quando provo a utilizzare un servizio Web che ho impostato in Java usando JAX-WS. Il servizio Web può essere utilizzato correttamente da un altro programma Java e da un sito Web C # / ASP.NET 2.0. Tuttavia, quando provo ad accedere allo stesso servizio utilizzando l'importatore WSDL in Delphi 2007 (patch 17-DEc-2007), il servizio Web JAX-WS non riconosce nessuno dei parametri che sto passando e li annulla.
Ho controllato il messaggio SOAP che è stato passato da Delphi e l'ho confrontato con gli altri e sono praticamente identici (ad eccezione di alcuni decadimenti trascurabili dello spazio dei nomi e un sacco di stato di visualizzazione da quello .NET!)
Sono stato anche in giro per il web (il collegamento più utile è stato il http://www.bobswart.nl/Weblog/Blog.aspx?RootId=5:798 ) ma nessuna gioia.
Qualcuno l'ha mai visto prima?
TIA.
La saga continua!
Dopo aver smanettato con l'oggetto HTTPRIO per provare a farlo funzionare, alla fine ho rinunciato e ho provato un trasferimento XML diretto su HTTP. Fail.
OK, quindi ho creato un semplice tester in C # e l'ho provato. Funziona senza problemi.
Usando Fiddler per vedere cosa veniva inviato avanti e indietro sembrava che l'unica differenza fosse negli spazi dei nomi. Ho cambiato gli spazi dei nomi nell'invio XML in Delphi e ... funziona!
Questo era un esempio dell'XML originale generato dal WSDLImporter:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<version xmlns="http://path.to.service.com/">
<input>test</input>
</version>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
ed ecco cosa funziona effettivamente:
<?xml version="1.0"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:version xmlns:ns2="http://path.to.service.com/">
<input>test</input>
</ns2:version>
</S:Body>
</S:Envelope>
Quindi, ora che lo so, devo cambiare i valori dello spazio dei nomi per il codice WSDLImporter? Non riesco a vedere nulla di ovvio nelle proprietà HTTPRIO.
TIA
Soluzione
HA HA VIVE !!!
Fondamentalmente ho dovuto togliere il raccomandato
InvRegistry.RegisterInvokeOptions(TypeInfo(ActivityService), ioDocument);
e forzalo a usare il Sec. 5 codifica. Gli spazi dei nomi vengono generati come richiesto e i parametri vengono passati al servizio Web Java.
Bene, ho bisogno di birra, molta birra :)
Altri suggerimenti
Dovresti semplicemente commentare questa riga nel tuo WSDL:
//InvRegistry.RegisterInvokeOptions(TypeInfo(WebService), ioDocument);
Basta ... divertiti.
Non è la soluzione al tuo problema, ma di recente ho avuto problemi con lo stesso ambiente. Ho dovuto cambiare le opzioni molte volte fino a trovare il modo giusto di consumare il servizio web (scritto in C #).
Check:
- THTTPRIO.Converter.Options
- THTTPRIO.HTTPWebNode
- THTTPRIO.HTTPWebNode.InvokeOptions
Ho sbattuto la testa contro il muro per due giorni, fino a quando ho trovato questo post ... E Cesars ha suggerito di controllare THTTPRIO.Converter.Options ... Ho provato quasi tutto, l'ultimo è stato quello di impostare soXXXXHdr su true - > poi è successo qualcosa di strano, niente più null al server: O ...
Non so perché questa impostazione faccia passare i valori, lo fa (almeno per me).
Sarebbe bello se qualcuno che capisse davvero cosa stava succedendo lo spiegherebbe.
La rimozione di soSendMultiRefObj da Converter.Options aiuta