【问题标题】:Sharing data types from multiple Web References从多个 Web 引用共享数据类型
【发布时间】:2009-02-18 16:39:12
【问题描述】:

假设供应商提供了两个独立的 Web 服务,它们共享相同的数据类型和相同的命名空间。

例如 以下 Web 服务都包含类似的对象,例如 TestCredentials 对象:

  • TestWebservice/Testwebservice1.asmx
  • TestWebservice/Testwebservice2.asmx

使用 Web 引用将这些包含到 Visual Studio 中,我最终得到:

  • Testwebservice1.TestCredentials
  • Testwebservice2.TestCredentials

当我真正想要的是:

  • Testwebservice.TestCredentials

在处理 Web 引用时,Visual Studio 中有什么方法可以将这两个 Web 服务链接在一起,以便生成的代理类是相同的(并且在同一个命名空间内)?

【问题讨论】:

    标签: c# .net web-services


    【解决方案1】:

    另一个可能的选项(连同 wsdl.exe /sharetypes)是使用 Visual Studio 2008 并使用“添加服务引用”。 “添加服务引用”对话框提供重用类型的选项。

    【讨论】:

    • 请注意,“添加服务引用”要求您的项目以框架 3.5 为目标,而“/sharetypes”适用于 2.0+。
    • 当然是的,最终,Visual Studio 将为 ASMX Web 服务生成 WCF 客户端。
    【解决方案2】:

    您必须使用 wsdl.exe program with the /sharetypes switch 手动生成代理类。

    【讨论】:

      【解决方案3】:

      您应该做的是使用wsdl.exe command line tool 生成一个代理类,而不是在Visual Studio 中添加Web 引用,然后您可以对其进行编辑以接受一个URL,而不是在单独的命名空间中使用两个硬编码的URL。

      【讨论】:

      • 无论如何我通常都会这样做,因为我讨厌网络参考工具。
      • 在vs08中添加为Web引用而不是服务引用,和它一样
      • 我从 2008 年开始使用 WCF。感谢您提供的信息
      • 看起来这里的答案是“wsdl /sharetypes”
      【解决方案4】:

      是的,您可以这样做。我们称其为数据编组器,但在本例中,我将其称为整合器。

      您会注意到 WSDL 生成的类是部分的,我们创建了一个 (web 引用名称).cs 文件并有类似的内容:

      以下是您创建的文件,而不是 WSDL 生成的文件

      WebReference1.cs

      
      public partial class WebReferenceName1 : System.Web.Services.Protocols.SoapHttpClientProtocol 
      {
          // take the methodname and append Local to the end
          public Consolidated.ReturnType MethodName1Local(params)
          {
              // redirect the return value of the call to the consolidation method and return the new value
              return Consolidation.Convert(this.MethodName1(params);
          }
      }
      

      然后是第二个网络服务

      WebReference2.cs

      
      public partial class WebReferenceName2 : System.Web.Services.Protocols.SoapHttpClientProtocol 
      {
          // take the methodname and append Local to the end
          public Consolidated.ReturnType MethodName2Local(params)
          {
              // redirect the return value of the call to the consolidation method and return the new value
              return Consolidation.Convert(this.MethodName2(params);
          }
      }
      

      现在是从这两种类型转换的类

      Consolidator.cs

      
      public class Consolidation
      {
          // Input from Web Reference #1
          public static Consolidated.ReturnType Convert(WebReferenceName1.ReturnType valuetoConvert)
          {
              // Convert from valuetoConvert to Consolidated.ReturnType
              convertedValue = (conversion of valuetoConvert to Consolidated.ReturnType);
      
              return convertedValue;
          }
      
          // Input from Web Reference #2
          public static Consolidated.ReturnType Convert(WebReferenceName2.ReturnType valuetoConvert)
          {
              // Convert from valuetoConvert to Consolidated.ReturnType
              convertedValue = (conversion of valuetoConvert to Consolidated.ReturnType);
      
              return convertedValue;
          }
      }
      

      基本上,您将方法添加到 Web 引用,调用 {WebMethod}Local() 方法,然后通过 Consolidator 进行路由,并将简单的 WSDL 生成的类转换为您可以实际使用的东西。

      Consolidated.ReturnType 是您在本地项目中定义的,它是 WSDL 在 Web 引用下生成的数据类型的本地版本。通常,“转换”只是从一种类型到另一种类型的属性复制的克隆/属性。

      【讨论】:

        【解决方案5】:

        您可以创建一个简单的 .disco 文件来引用所有 Web 服务。它只是每个 Web 服务的简单 contractRef。

        Visual Studio 将共享这些类型,只要它们使用相同的 xml 命名空间。

        【讨论】:

          【解决方案6】:

          我不这么认为,至少在不修改自动生成的 reference.cs 代码的情况下是这样。

          想到的是一些解决方法: 1) 创建一个基于反射的复制方法,该方法根据属性名称复制值或 2) 如果您使用的是 .NET 3.5,请编写扩展方法以在两种类型之间进行复制。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-04-03
            • 1970-01-01
            • 1970-01-01
            • 2023-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多