【问题标题】:"Update Service Reference" Changes the Definition of some Proxy Types“更新服务参考”更改了一些代理类型的定义
【发布时间】:2015-02-02 21:16:43
【问题描述】:

我刚刚做了一个“更新服务参考”来进行一次更改。向服务中添加了一个操作,我们想使用它。

不幸的是,在不同的 XML 命名空间中有两个同名的代理类。服务引用在服务引用命名空间中将它们生成为“Entity”和“Entity1”。

运行“更新服务引用”改变了这些类的顺序,所以原来的“Entity”现在是“Entity1”,反之亦然!

有什么方法可以使这些生成的类名稳定吗?可以让我说,“对于命名空间 y 中的 complexType A,创建该实体,对于命名空间 z 中的 complexType A,创建该实体 1”。这样,顺序就不会改变。

附:真正不幸的是,这份合同还剩一个小时左右 - 从字面上看,没有明天!

【问题讨论】:

    标签: wcf wcf-client


    【解决方案1】:

    要覆盖默认命名行为并自行解决冲突,请将DataContractAttributeName 属性显式设置为替代名称:

    [DataContract(Name="Entity1")]
    public class Entity
    { ... }
    

    【讨论】:

      【解决方案2】:

      VS 添加/更新服务参考功能允许通过编辑 .svcmap 文件来配置自身(here 对此有更多信息)。此文件将在更新服务器引用期间保留更改。不幸的是,您无法更改服务更新期间生成的类的顺序。但是您可以自定义 NamespaceMappings 以指定从 WSDL 或 XML shema 命名空间到 CLR 命名空间的映射。

      例如,这是第一个实体:

      namespace EntitiesServiceLibEntity1
      {
          [DataContract]
          public class Entity
          {
              [DataMember]
              public string StringValue
              {
                  get { return m_stringValue; }
                  set { m_stringValue = value; }
              }
      
              private string m_stringValue;
          }
      }
      

      这是一秒钟:

      namespace EntitiesServiceLibEntity2
      {
          [DataContract]
          public class Entity
          {
              [DataMember]
              public int IntValue
              {
                  get { return m_intValue; }
                  set { m_intValue = value; }
              }
      
              private int m_intValue;
          }
      }
      

      为您的项目使用“显示所有文件”选项并扩展您的服务参考。然后编辑 Reference.svcmap 文件,添加以下 NamespaceMappings:

      <NamespaceMappings>
        <NamespaceMapping TargetNamespace="http://schemas.datacontract.org/2004/07/EntitiesServiceLibEntity1" ClrNamespace="EntitiesServiceLibEntity1" />
        <NamespaceMapping TargetNamespace="http://schemas.datacontract.org/2004/07/EntitiesServiceLibEntity2" ClrNamespace="EntitiesServiceLibEntity2" />
      </NamespaceMappings>
      

      在此之后,您可以使用命名空间来代替(错误地)生成的类名:

      EntitiesServiceLibEntity1.Entity entity1 = client.GetEntity1();
      EntitiesServiceLibEntity2.Entity entity2 = client.GetEntity2();
      

      但是,如果您有权访问服务合同(您或您的团队开发了它并且可以在不破坏其他客户的情况下进行更改),您可以使用 DataContract.Name 属性为类设置不同的名称,正如@Patrice Gahide 提到的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 2013-07-21
        • 2011-11-11
        • 1970-01-01
        相关资源
        最近更新 更多