2009-07-28 143 views
3

我在尝试通过Delphi访问Web服务时遇到问题。我已经使用了WSDLimp工具的2007版本的一个java WSDL,并且它看起来正确地创建了所有对象。但是,当我制作一个测试程序时,每个对象都是空的,调用该服务。如果我在HTTPRIOAfterExecute方法中转储SOAPResponse对象,我可以看到我收回了一个格式正确的XML Soap数据包,其中包含我期望的所有数据,但我无法通过这些对象访问它。那么有什么我失踪?Delphi 2005 Web服务问题

+0

由于您使用的是命令行导入器而不是IDE,因此以下是一个方便的参考。 http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/wsdlimp_xml.html – 2009-07-28 18:10:12

回答

1

Web服务响应包含每个属性的别名名称空间。这些别名未在WSDL中定义。例如,WSDL包含一个名为“http://www.example.com/SomeService”的名称空间,以及顶层节点中的xmlns:ns3 =“http://www.example.com/SomeService”的请求别名。因此,响应中的属性看起来像ns3:somePropertyName =“[value]”。

在OPToSOAPDomConv单元的TSOAPDomConv.InitObjectFromSOAP中,它试图查找没有命名空间前缀的属性名称。这导致查找失败并且对象属性留空。即使在2007年的源文件中也是如此。

我能看到的最佳解决方案是修改InitObjectFromSOAP例程。

围绕线4181,添加:

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

,改变AttrNode.HasAttribute到NS变量传递作为第二个参数所以它看起来像:

if AttrNode.HasAttribute(ExternalPropName, NS) then 

而且,几行向下是一个SetObjectPropFromText调用。最后一个参数是属性值,你就需要改变Attr.Attributes [ExternalPropName]到

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

当然申报NS,PROPNAME和IsScalar瓦尔。

1

讨论的解决方案德尔福下降的Web服务支持球德尔福7后,并没有再次合作让他们的行为,直到德尔福2007年(2006年虽然是一个改进)。

如果它在Delphi 2007中适用于您,您可能可以通过使用更新的SOAP运行时在Delphi 2005中使用它。

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

+0

我不幸没有进入D2007。我确实使用了链接中引用的WSDLimp。我绝对注意到D2005创建了令人难以置信的错误代码。我认为我的问题发生在SOAPResponse被转换为对象的地方。任何想法发生在哪里?我试过了代码,但我还没有看到甚至试图发生的地方。 – mcmar 2009-07-29 12:28:17

0

我重新阅读问题和事实,即它是一个Java Web服务让我记住的东西。

确保您使用最新的WSDLImp和SOAP单元。在导入的设备中查看对RegisterInvokeOptions的调用。第二个参数应该是ioDocument。如果将此更改为ioDefault,会发生什么情况。

我记得有一篇文章提到了Java NetBeans(可能?)Web服务的这个帖子,但还没有尝试过。