0

我有两组需要从 C# 调用的 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用于生成存根,class类型 mytype 写在一个目录中com\abc\ws\myutil,它被放入package com.abc.ws.myutilwsdl 中的 targetNamespace 属性所指定的 a 中。

因此,如果我只想从第一个 wsdl 调用 web 服务,我在第一个 wsdl 上运行轴并生成类,然后创建 jar。

如果我只想从第二个 wsdl 调用 web 服务,我在第二个 wsdl 上运行轴并生成类,然后创建 jar。

如果我想从两个 wsdl 调用 web 服务,我首先在第一个 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使用targetNamespacewsdl中指定的?有没有办法让我做到这一点,这样我就只有一个 mytype 类?

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

4

1 回答 1

1

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

/sharetypes

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

于 2013-04-05T07:52:55.287 回答