在WCF中向现有的DataContract添加DataMember

12

我想在我的一个DataContract中添加一个DataMember。 我想知道,如果参与通信的一方没有更新,那么现有的服务器和客户端将如何处理新的DataMember

我记得有一种方法可以使DataMember成为可选项,但我不确定它是否适用于所有场景:

  • 已更新的客户端=>旧服务器
  • 旧客户端=>更新的服务器
  • 已更新的客户端 <= 旧服务器
  • 旧客户端 <= 更新的服务器
1个回答

15

WCF会优雅地处理它不能识别的新成员。契约的消费者(在客户端或服务器端)将简单地“看不到”该成员,因此一个结果是新成员永远不应该是 IsRequired=true 属性。

此外,只要DataContract实现了 IExtensibleDataObject,WCF就会透明地在组件之间桥接新属性。例如,如果消息路径为:

更新后的客户端 => 旧服务器 => 更新后的服务器

那么链末端的更新后的服务器仍然会看到新的DataMember。但是,“旧服务器”将看不到该新的DataMember。

如果旧服务器向更新后的客户端发送消息,则新的DataMember在新客户端中反序列化时将被设置为 default(type)

有关DataContract版本控制的最佳实践,请参见此处

本文讨论了 Breaking和Non-Breaking更改之间的区别


从您提供的最后一个链接中可以看出:在大多数情况下,添加或删除数据成员不会导致破坏性变更。 - Jader Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接