代码之家  ›  专栏  ›  技术社区  ›  bakasan

/与svcutil.exe等效的sharedtypes?

  •  17
  • bakasan  · 技术社区  · 14 年前

    构建一个依赖第三方提供者的应用程序,第三方提供者拥有一组非常详细的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.
    

    我无法控制wsdls的输出。我不想手工编辑wsdl,因为担心在运行时出现错误,很难追踪到WSDL文件的编辑。更不用说,有50个WSDL文件的范围是200-1200行XML。(再次提醒我,为什么我们认为肥皂是90年代后期对我们所有人的巨大拯救?)

    3 回复  |  直到 11 年前
        1
  •  2
  •   Darin Dimitrov    14 年前

    尝试在一个命令中指定所有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
  •  0
  •   Daniel Jensen    14 年前

    我也有类似的问题。通过为不同的XML命名空间定义不同的clr命名空间(使用svcutil的/namespace参数),我可以使它正常工作。

    /namespace:http://www.opengis.net/gml,OpenGIS.GML
    
        3
  •  0
  •   richardstartin    12 年前

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