为什么不添加Web引用使用wsdl中指定的模式targetNamespace

时间:2013-04-04 17:00:49

标签: c# .net vb.net web-services visual-studio

我需要从C#调用两组Web服务。这两组Web服务都来自同一个提供商和两者共享一个复杂类型,它存在于两个wsdls中。

这就是复杂类型defn的样子

<wsdl:types>
    <schema targetNamespace="http://abc.com/ws/myutil" xmlns="http://www.w3.org/2001/XMLSchema">
        <complexType name="mytype">
            <sequence>
                <element name .....
                <element name ....
                <element name .....
            </sequence>
        </complexType>
    </schema>
    .....
</wsdl:types>

wsdls和targetNamespace中都存在上述复杂类型,因为mytype在两个wsdls中都是相同的。

这不会导致java出现任何问题。 我使用Axis生成存根,mytype类型的class写在目录com\abc\ws\myutil中,并按照指定放入package com.abc.ws.myutil通过wsdl中的targetNamespace属性。

因此,如果我只想从第一个wsdl调用webservices,我会在第一个wsdl&amp;上运行axis。生成类然后创建jar。

如果我只想从第二个wsdl调用webservices,我会在第二个wsdl&amp;上运行axis。生成类然后创建jar。

如果我想从两个wsdl调用webservices,我首先在第一个wsdl&amp;上运行axis。然后第二个wsdl&amp;然后创建jar。

在第二个wsdl上运行Axis会覆盖在com \ abc \ ws \ myutil中生成的mytype.java类文件。但这并不重要,因为从第一个wsdl为mytype.java生成的类文件与从第二个wsdl生成的类文件相同。我创建的组合jar只包含一个mytype&amp;它可以与wsdls的webservices一起使用。

然而,这个相同的场景给了我C#中的问题。我为第一个wsdl URL添加了一个webreference,它将生成的类放在第一个名称空间&amp;然后,当我为第二个wsdl URL添加webreference时,它会将生成的类放在第二个名称空间中。

所以我最终在2个名称空间中有2个mytype类。

所以我的问题是为什么Add Webreference不使用wsdl中指定的targetNamespace?有没有办法让我这样做,所以我只有一个mytype类?

ASP.NET VB程序也存在同样的问题。

1 个答案:

答案 0 :(得分:1)

如果您使用命令行工具wsdl.exe,则可以使用/shareTypes开关:

  

/ sharetypes

     

打开类型共享功能。此功能创建一个代码文件   不同之间共享的相同类型的单一类型定义   服务(名称空间,名称和电线签名必须相同)。   使用http:// URL作为命令行参数引用服务   或者为本地文件创建一个discomap文档。