我需要从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程序也存在同样的问题。
答案 0 :(得分:1)
如果您使用命令行工具wsdl.exe
,则可以使用/shareTypes
开关:
/ sharetypes
打开类型共享功能。此功能创建一个代码文件 不同之间共享的相同类型的单一类型定义 服务(名称空间,名称和电线签名必须相同)。 使用http:// URL作为命令行参数引用服务 或者为本地文件创建一个discomap文档。