0
  1. 我没有在服务器的 DC 中实现这个接口。

  2. 虽然我在客户端自动获得了 VS2008 生成的这个实现,但这很好。

  3. 现在我去编辑我的 Reference.cs 以包含一个新字段(区分特定服务方法的服务器 DC(输入参数))

  4. 编译,运行指向旧服务的代码,尽管我将新字段的值(示例布尔类型为 true)设置为忽略我的值,但它工作得很好。

  5. 那为什么要在服务器上实现 DC

  6. 我期待前向兼容性,它工作正常。

  7. 现在我删除了我在#3 中添加的代码。编译。

  8. 而是在服务器 DC 编译中添加了相同的字段。

  9. 现在我运行从客户端向服务器发送较少数据的代码 DC 有更多列。它工作正常。这意味着向后兼容性工作正常吗?

  10. 希望有些地方我的理解不正确?

我的环境是.Net 3.5 Sp1

4

1 回答 1

1

IExtensibleDataObject 用于不同的目的。假设您有如下操作:

[DataContract]
public class MyObject
{
  [DataMember]
  public string MyMember { get; set; }
}

[ServiceContract]
public class MyService
{
  [OperationContract]
  public MyObject Operation(MyObject object)
  {
    object.MyMember += " modified";
    return object;
  }
}

预期的行为是 Operation 返回修改后的参数。

现在假设您在客户端修改数据协定:

[DataContract]
public class MyObject
{
  [DataMember]
  public string MyMember { get; set; }
  [DataMember]
  public string MyNewMember { get; set; }
}

现在让我们调用操作:

var client = new MyServiceClient();
var myObject = new MyObject
  {
    MyMember = "Member",
    MyNewMember = "Some value"
  }; 

MyObject returnedObject = client.Operation(myObject);

服务的数据契约没有实现 IExtensibleDataObject 并且它不知道 MyNewMember 属性。ReturnedObject.MyNewMember 中的值是多少?它将为空。但是,如果您在服务器端实现 IExtensibleDataObject,即使服务器对此属性一无所知,它也会是“某些值”。

于 2010-12-27T12:44:09.027 回答