【发布时间】:2013-04-04 17:00:49
【问题描述】:
我需要从 C# 调用 2 组 Web 服务。这两组 web 服务都来自同一个提供者,并且都共享一个 complexType,它存在于两个 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中,并且类型mytype的targetNamespace在两个wsdls中是相同的。
这不会导致java 出现任何问题。
我使用Axis 来生成存根,类型mytype 的class 写在目录com\abc\ws\myutil 中,并且它被放入由wsdl 中的targetNamespace 属性指定的package com.abc.ws.myutil。
因此,如果我只想从第一个 wsdl 调用 web 服务,我会在第一个 wsdl 上运行轴并生成类,然后创建 jar。
如果我只想从第二个 wsdl 调用 web 服务,我在第二个 wsdl 上运行轴并生成类,然后创建 jar。
如果我想从两个 wsdl 调用 webservices,我首先在第一个 wsdl 上运行轴,然后在第二个 wsdl 上运行,然后创建 jar。
在第二个 wsdl 上运行 Axis 会覆盖在 com\abc\ws\myutil 中生成的 mytype.java 类文件。但这并不重要,因为从第一个 wsdl 为 mytype.java 生成的类文件与从第二个 wsdl 生成的类文件相同。我创建的组合 jar 仅包含一个 mytype,它可以与来自两个 wsdls 的 Web 服务一起使用。
但是,这种相同的场景在 C# 中给我带来了问题。我为第一个 wsdl URL 添加了一个 webreference,它将生成的类放在第一个命名空间中,然后当我为第二个 wsdl URL 添加一个 webreference 时,它将生成的类放在第二个命名空间中。
所以我最终得到了 2 个命名空间中的 2 个 mytype 类。
所以我的问题是为什么Add Webreference 不使用wsdl 中指定的targetNamespace?有没有办法让我做到这一点,这样我就只有一个 mytype 类?
ASP.NET VB 程序也有同样的问题。
【问题讨论】:
-
ASMX 是一项遗留技术,不应用于新开发。 WCF 应该用于 Web 服务客户端和服务器的所有新开发。一个提示:微软已经在 MSDN 上停用了ASMX Forum。
-
@JohnSaunders - 什么是 ASMX 以及为什么你认为我在使用它 - 我什至没听说过。
-
您正在使用“添加 Web 引用”,这是传统 ASMX 技术的一部分,之所以这么称呼是因为服务使用了 .asmx 文件扩展名。
标签: c# .net vb.net web-services visual-studio