“更新服务引用”更改某些代理类型的定义

时间:2014-02-19 23:44:16

标签: wcf wcf-client

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

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

运行“更新服务参考”改变了这些类的顺序,因此“实体”现在是“实体1”,反之亦然!

有没有办法让这些生成的类名稳定?有些东西可以让我说,“对于名称空间y中的complexType A,使该实体,以及对于名称空间z中的complexType A,使该Entity1”。这样,订单就无法改变。

P.S。真正令人遗憾的是,这份合约还有一个小时的时间 - 确实 没有明天!

2 个答案:

答案 0 :(得分:2)

要覆盖默认命名行为并自行解决冲突,请将Name的{​​{1}}属性明确设置为替代名称:

DataContractAttribute

答案 1 :(得分: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所述。