题 / sharedtypes等效于svcutil.exe?


构建一个依赖于第三方提供商的应用程序,该提供商拥有非常冗长的SOAP服务(我们正在讨论50多个WSDL文件)。但是,每个单独的WSDL都有许多共享类型声明。使用wsdl.exe生成客户端代码时,曾经有一个/ sharedtypes标志,如果多次找到类型,它将合并重复的条目。

当我尝试生成我的客户端代码时,我会轰炸第三方在其所有WSDL文件中包含的这些重叠类型。

svcutil /t:code /importxmltypes [mypath]/*.wsdl

导致错误消息导致类型冲突。例如,以下错误消息的几个示例:

Error: There was an error verifying some XML Schemas generated during export:
The simpleType 'http://common.soap.3rdparty.com:CurrencyNotation' has already been
declared.

Error: There was an error verifying some XML Schemas generated during export:
The complexType 'http://common.soap.3rdparty.com:NumberFormat' has already been 
declared.

我无法控制WSDL的输出。我不想手动编辑WSDL,因为担心在运行时以某种方式破坏的错误很难追溯到我们编辑WSDL文件。更不用说有50个一些WSDL文件,范围从200到1200行XML。 (再次提醒我为什么我们认为SOAP在90年代后期对我们所有人来说都是伟大的救赎?)


17
2018-03-02 07:55


起源




答案:


尝试在一个命令中指定所有WSDL:

svcutil http://example.com/service1?wsdl http://example.com/service2?wsdl ...

这应该自动处理重复的类型。另一个选择是看看 /reference 命令开关:

/reference:<file path>        - Add the specified assembly to the set of
                                assemblies used for resolving type
                                references. If you are exporting or
                                validating a service that uses 3rd-party
                                extensions (Behaviors, Bindings and
                                BindingElements) registered in config use
                                this option to locate extension assemblies
                                that are not in the GAC.  (Short Form: /r)

这意味着如果您已经在某个程序集中定义了某些类型,则可以包含此程序集和 svcutil 将从中排除类型以避免重复:

svcutil /reference:someassembly.dll http://example.com/service?wsdl

2
2018-03-02 08:02



所有的wsdl都是本地的,但这不是重点。我的问题不在于我无法传递几个.wsdl文件。问题是源在每个wsdl文件中包含多个数据类型(如果不是全部,则包含多个数据类型)。例如,浏览我打开的前6个wsdls,它看起来有一个名为CurrencyNotation的类型的ComplexElement条目。当svcutil试图解析我所有的wsdls时,它说,哦,嘿,currencyNotation已经存在,非常抱歉。繁荣。 - bakasan
所以你说单独键入每个wsdl路径的行为与* .wsdl(所有wsdl驻留在本地)的行为不同。因为这是我们代理的第一代,所以我真的没有可以引用的程序集。策略是解析一个wsdl,编译成一个dll,然后引用它用于下一个吗?解决欺骗,然后冲洗并重复其余部分? - bakasan
还没准备好输入所有50多个wsdl文件的路径,但只测试了两个,svcutil foo.wsdl bar.wsdl用相同的重复类型消息进行了轰炸。在几年前从wsdl.exe处理过w /痛之后,看到svcutil.exe在这个时代并没有出现更好的效果并不是很令人欣慰。 :P - bakasan


我遇到了类似的问题。通过为不同的xml命名空间定义不同的CLR命名空间(使用svcutil的/ namespace参数),我能够使它工作。

/namespace:http://www.opengis.net/gml,OpenGIS.GML

0
2017-09-19 10:29





我一直在使用wsdl.exe来解决这个问题,因为我使用了一些SOAP Web服务,它们在不同的端点定义相同的数据传输对象。所以我使用wsdl.exe,因为它有sharetypes开关。我不是WPF开发人员所以我并不关心输出没有为WPF实现IWhatever,但生成的类都是部分的,所以你可以做一些工作来在一个单独的文件中实现你关心的接口。


0
2018-05-01 10:17