我对Web服务完全陌生,但对 Delphi 并不陌生。
我正在用“WSDL导入器”向导将一个WSDL文件导入 Delphi 2010。WSDL文件包含一些Delphi完全忽略的“attributeGroup”标签,这可能是一个bug,尽管我还没有在质量中心找到关于这个问题的条目,只在像here和here这样的论坛中提到过。
我的问题有几个部分:
1.最佳解决方法是什么?
1.我已经编写了一个Python脚本来格式化WSDL文件,以便将所有对attributeGroup标记的引用替换为attributeGroups中定义的属性的声明;换句话说,就是扁平化引用。2输出通过“WSDL导入器”向导成功地导入到 Delphi 中,看起来是正确的,但是我还没有测试通过这个新的WSDL文件构造的消息是否能正确工作。3这个策略可能可行吗,还是我应该现在就退出,转而做其他更有效率的事情?
更新
根据我的经验和这个问题的答案,我决定使用一个C#控制台应用程序来进行 Package ,该应用程序接收JSON输入数据并输出JSON回复数据。一个 Delphi 应用程序驱动C#应用程序。整个过程中的SOAP部分现在变得毫不费力,并且在C#.NET中“正常工作”。并且 Delphi 可以很好地处理其余的功能。我会向其他有类似问题的人推荐这种方法。我确实尝试过将C# SOAP程序集导出为COM库,然后从 Delphi 连接到它,但它变得非常复杂,因为我的特定应用程序中的SOAP规范很大,而且有些复杂。
4条答案
按热度按时间vs91vp4v1#
好吧,这个花了点时间。
根据this post,当导入wsdl文件时,.NET wsdl.exe工具无法识别某些标记。
属性组:已忽略。DataContractSerializer不支持使用xs:group、xs:attributeGroup和xs:attribute。这些声明作为xs:schema的子级被忽略,但不能从complexType或其他支持的构造中引用。
在一个MSDN blogs上也描述了这种行为(尽管是以一种非常难以理解的方式)。在我的特定示例中,导致问题的wsdl文件的特定部分如下所示:
看起来
<xs:attributeGroup ref="TelephoneInfoGroup"/>
被.NET wsdl.exe工具忽略了,就像它被 Delphi wsdl导入程序忽略了一样。在这种情况下,如果在Delphi和.NET中导入都失败,wsdl文件可能必须被更改,这意味着我将不得不使用我自制的python ref-flattener。mlnl4t2r2#
我们在 Delphi 2009和标准Soap服务(CRM)中遇到了类似的问题。它与attributeGroup无关。我们发现了如此多的不兼容性,以至于我们最终决定使用一个小型C#应用程序作为真实的的基于.Net的服务的代理。
mrwjdhj33#
我是你给予的第一个参考的海报。我想我发现这个bug从来没有被修复过。
我后来在Embarcadero开发者网络上发布了another question,Nick Hodges说:
我们专注于客户端开发[...],如果你正在寻找建立SOAP服务器,那么我建议你也给予 Delphi 棱镜看看。
我们决定改用C#来开发SOAP服务器。我决定让服务与数据库对话,然后由 Delphi 应用程序访问。
后来我在 Delphi 下开发客户端时也遇到了一些问题,所以我们也用C#来做。这次C#类是com可见的,可以从Delphi中访问。看起来工作得很好。
问候你,米尔。
ojsjcaue4#
Delphi WSDL导入程序不能处理
<xsd:attributeGroup ref="...">
元素,但是您可以用引用的实际属性替换这些元素,导入程序可以处理这些属性。以下是执行此替换的PowerShell脚本。
这个剧本是未经修饰的。它只是我为自己的需要而创作的。它可能对你也有用,或者至少它应该给予你一个起点。