我已经把我的web服务转换成wcf服务,它有一些数据契约。作为一个最佳实践,我们提到并建议datacontracts应该从iextensibledataobject继承。我认为,在添加或删除数据成员时,iextensibledataobject是有帮助的。但我不知道客户端如何访问已删除的数据成员。这是我的代码:

[ServiceContract(Namespace = "http://mycompany.com/2010/08/")]
public class MyWebService {
    [OperationContract]
    public Employee Add(Employee emp)
    {
        // Some Processing
    }
}

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/08/")]
public class Employee : IExtensibleDataObject {
    [DataMember] public string FirstName;
    [DataMember] public string LastName;

    public ExtensionDataObject ExtensionData  { get; set; }
}

现在在我的下一个web服务版本中,我对datacontract做了一些更改
[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/09/")]
public class Employee : IExtensibleDataObject {
    [DataMember] public string FirstName;
    [DataMember] public string LastName;
    [DataMember(IsRequired = true)] public string MiddleName;

    public ExtensionDataObject ExtensionData  { get; set; }
}

但是,正在访问我的旧版本web服务的客户端现在由于不提供middlename字段而收到错误。我仍然对iextensiondataobject的使用感到困惑。

最佳答案

恐怕这不是iextensibledataobject的正确用法,iextensibledataobject接口是为支持版本往返而设计的,请阅读下面关于转发兼容性的msdn文章:
http://msdn.microsoft.com/en-us/library/ms731083.aspx
下面是另一篇关于数据合同版本控制的最佳实践的文章:
http://msdn.microsoft.com/en-us/library/ms733832.aspx

08-06 18:47