5

我有一个与这个问题类似的问题。我有多个使用 WCF 使用的 Web 服务,它们都共享类型。服务本身是用 Java 编写的,我无权访问它们。共享类型具有相同的签名,但svcutil.exe在运行时会出现此错误:

Error: There was a validation error on a schema generated during export:
    Source:
    Line: 8 Column: 3
   Validation Error: The complexType 'http://MyServer.MyService:CommonType' has already been declared.

CommonType使用的两个 Web 服务中具有相同的签名。我是这样称呼的svcutil

svcutil.exe /o:GeneratedServices.cs /n:*,MyNamespace.Generated http://MyServer.MyService1?WSDL http://MyServer.MyService2?WSDL

我知道wsdl.exe/mergeTypes标志,它适用于这些服务,但有一些svcutil.exe我真的很想使用的选项。我确实有人证明这对我来说是可能的,但是后端也在使用 .NET 和 WCF,而且我使用的 Java 后端一直没有成功。

4

3 回答 3

5

首先 - 它们完全一样吗?特别是,SOAP 名称空间必须匹配(除了其他所有内容)。如果不是,那么它们是不同的(不兼容的)类型;您将不得不使用 2 个不同的引用(在不同的 C# 命名空间中以避免冲突),并在两种类型之间转移数据。

如果类型相同但它仍然不起作用,那么您也许可以将 /r 开关与 svcutil 一起使用来使用现有程序集中的类型。尝试使用它一次来获取第一个类型(仅来自 1 个 url) - 然后将该代码编译到程序集中。使用 svcutil 对第二个端点使用 /r 标志来标识您刚才生成的程序集。

笔记; 一个相关的主题是partial class为一种或多种类型编写一个 - 例如,为类型本身提供转换方法/运算符。这可能会使事情变得更简单。例如,您可以在不同命名空间中的两个相似类型之间编写隐式(或显式)静态转换运算符。

于 2009-04-01T08:20:25.187 回答
0

用警告(和上下文)扩展答案:不要忘记,svcutil.exe 只是一个工具。您可以修改或扩展生成的代码 - 没有禁止它。当然,自定义生成的代码也有缺点,你应该睁大眼睛去做。

在早期,当通过 Web 服务将异构客户端和服务器装配在一起时,我经常求助于修改生成的 WSDL,修改从 WSDL 生成的代码(在连接 AXIS 和 .NET 时,我编写了许多 sed 脚本来交换命名空间),以及其他定制方法。一些使用时间最长的 Web 服务仍然需要这个。一个例子是 MS Office 研究服务,它根本不提供 WSDL...

另一种可能有效也可能无效的方法是通过部分类扩展生成的 .NET 代码。这是调整 XML 命名空间、添加可选元素(如版本字符串?)以及进行其他调整的好方法。当您重新生成代码时,您的扩展不会被覆盖。

编辑:从反对票来看,有些人认为这太冒险了!!!我完全理解。

于 2009-04-01T08:51:12.677 回答
0

由于它存在于两个服务中,因此在对这两个服务运行 svcutil 后,您最终会得到两个声明。我认为 svcutil.exe 不够聪明,无法意识到两个 Web 服务中都存在相同的类型。

您可能需要手动消除重复声明。如果它们确实相同,那么您应该能够将其修复为仅使用其中一个并消除另一个。

于 2009-04-02T02:42:15.990 回答