2009-07-28 13 views
3

Ich habe ein Problem beim Zugriff auf einen Web-Service über Delphi. Ich habe eine Java-WSDL mit der Version 2007 des WSDLimp-Tools verbraucht und es scheint, als ob alle Objekte korrekt erstellt wurden. Wenn ich jedoch ein Testerprogramm mache, das den Dienst aufruft, ist jedes Objekt leer. Wenn ich das SOAPResponse-Objekt in der Methode HTTPRIOAfterExecute ablege, kann ich sehen, dass ich ein korrekt formatiertes XML-Soap-Paket zurückbekommen habe, das alle Daten enthält, die ich erwarten würde, aber ich kann nicht über die Objekte darauf zugreifen. Gibt es etwas, das mir fehlt?Delphi 2005 Web Services-Problem

+0

Da Sie anstelle der IDE den Befehlszeilenimport verwenden, finden Sie hier eine praktische Referenz. http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/wsdlimp_xml.html –

Antwort

1

Die Web-Service-Antwort enthält Alias-Namespaces für jedes Attribut. Diese Aliase sind in der WSDL nicht definiert. Zum Beispiel enthält die WSDL einen Namespace von "http://www.example.com/SomeService" und die Anfrage-Aliase, die im Knoten der obersten Ebene als xmlns: ns3 = "http://www.example.com/SomeService" on-the-fly angezeigt werden. Die Attribute in der Antwort sehen also wie folgt aus: ns3: somePropertyName = "[value]".

In der Einheit OPToSOAPDomConv versucht TSOAPDomConv.InitObjectFromSOAP, einen Attributnamen ohne das Namespacepräfix nachzuschlagen. Dies führt dazu, dass die Suche fehlschlägt und die Objekteigenschaft leer bleibt. Dies geschieht sogar mit den 2007 Quelldateien.

Die beste Lösung, die ich sehen kann, ist die InitObjectFromSOAP Routine zu ändern.

Strecken Linie 4181, fügt:

RemTypeRegistry.InfoToURI(PropList[i].PropType^, NS, PropName, IsScalar); 

und die AttrNode.HasAttribute ändern, um den NS-Variable als zweiten Parameter zu übergeben, so dass es wie folgt aussieht: Auch

if AttrNode.HasAttribute(ExternalPropName, NS) then 

, ein paar Zeilen nach unten ist ein SetObjectPropFromText-Aufruf. Der letzte Parameter ist der Attributwert, und Sie werden Attr.Attributes [ExternalPropName] zu

SetObjectPropFromText(Instance, PropList[I], AttrNode.GetAttributeNS(ExternalPropName, NS)) 

Und natürlich ändern müssen erklären, die NS, PropName und IsScalar Vars.

1

diskutiert versuchen Delphi den Ball auf Web-Service-Support nach Delphi fiel 7 und nicht bekommen ihre Tat wieder zusammen, bis Delphi 2007 (obwohl 2006 war eine Verbesserung).

Wenn es in Delphi 2007 für Sie funktioniert, können Sie wahrscheinlich mit der aktualisierten SOAP-Laufzeitumgebung in Delphi 2005 arbeiten.

http://cc.embarcadero.com/Item/24535

+0

Ich habe leider keinen Zugriff auf D2007. Ich habe den WSDLimp verwendet, auf den in Ihrem Link verwiesen wird.Ich habe definitiv festgestellt, dass die D2005 unglaublich falschen Code erstellt hat. Ich denke, dass mein Problem dort ist, wo die SOAPResponse in die Objekte übersetzt wird. Irgendeine Idee, wo das passiert? Ich habe versucht, durch den Code zu gehen, aber ich habe nicht gesehen, wo das überhaupt passiert. – mcmar

+0

Verwenden Sie die aktualisierten Einheiten von demselben Link? Sie werden von Delphi 2007 verwendet und können mit der Einheit umgehen, die durch die neuen WSDLImp- und Web-Service-SOAP-Pakete generiert wird. –

+0

Ich werde zugeben, dass ich die aktualisierte Quelle nicht bis gestern verwendet habe, als ich erkannte, dass es Quelle zusammen mit der neueren WSDL gab. Aber ich bekomme genau die gleichen Ergebnisse. – mcmar

0

ich die Frage und die Tatsache, erneut gelesen, dass es sich um eine Java-Web-Service ist hat mich an etwas erinnern.

Stellen Sie sicher, dass Sie die neuesten WSDLImp- und SOAP-Einheiten verwenden. Suchen Sie in der importierten Einheit nach dem Aufruf von RegisterInvokeOptions. Der zweite Parameter sollte ioDocument sein. Was passiert, wenn Sie dies zu ioDefault ändern?

Ich erinnere mich an einen Post irgendwo, dass dies für Java NetBeans (vielleicht?) Webdienste vorgeschlagen, aber es nicht versucht haben.