【问题标题】:Identical Types In Separate Web Services不同 Web 服务中的相同类型
【发布时间】:2023-03-03 13:35:02
【问题描述】:

我遇到了与question 类似的问题。我有多个使用 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 后端一直没有成功。

【问题讨论】:

    标签: .net wcf web-services svcutil.exe


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这不起作用,因为服务方法调用该特定类型。如果 MyServiceAlpha.DoSomething() 将 MyServiceAlpha.Widget 作为参数,则不会采用 MyServiceBeta.Widget。
      • 可能是这样,但我之前创建过共享类型的服务。所以我不认为仅仅因为它们被两种不同的服务使用就一定会使它们不同。
      【解决方案3】:

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

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

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

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

      【讨论】:

      • 虽然是这样,但这并不总是一个好主意。对于扩展代码(添加方法等),您应该使用分部类。如果您修改代码,您就没有更新服务的良好途径(如果这是必需的),并且您可能会破坏它(很容易做到)。
      • 刚刚看到这个跳跃(编辑)——我认为它不值得投反对票;当我得到一些选票时,将在几个小时内修复! (或者当我起床时......)[固定]
      • 我反对修改生成代码的概念。编辑答案说“你可以扩展......使用部分类”,我会再次投票。
      猜你喜欢
      • 2010-09-17
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      相关资源
      最近更新 更多