Delphi 2005 Web服务问题

时间:2009-07-28 16:34:55

标签: delphi wsdl

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

4 个答案:

答案 0 :(得分:1)

德尔福在德尔福7之后放弃了网络服务支持并且在Delphi 2007之前没有再次采取行动(尽管2006年是一项改进)。

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

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

答案 1 :(得分: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变种。

答案 2 :(得分:0)

您可以尝试http://www.borlandtalk.com/1-vt102378.html?start=0

中讨论的解决方案

答案 3 :(得分:0)

我重新阅读了这个问题以及它是一个Java Web服务让我记住了一些事实。

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

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