【问题标题】:DataContract Versioning and changing IsRequired attribute in different versionsDataContract 版本控制和更改不同版本中的 IsRequired 属性
【发布时间】:2014-03-25 17:51:53
【问题描述】:

在 DataContract 类中执行宽松的版本控制时,Best Practices: Data Contract Versioning 指南指出:

不要在版本之间更改任何现有数据成员的 IsRequired 属性。

但随后Data Contract Versioning 指南指出:

将 IsRequired 属性值从 true 更改为 false 不会破坏,但如果任何先前版本的类型没有相关数据成员,则将其从 false 更改为 true 可能会破坏。

第一个指南说永远不应该更改IsRequired,然后第二个指南说从false 更改为true 不会中断。

您如何反映在更高版本的合同中不再需要某个属性?如果我将IsRequiredtrue 更改为false,这不会破坏使用早期版本的客户吗?他们将能够省略曾经需要的属性。这种变化是否需要引入新合同?

【问题讨论】:

    标签: c# wcf versioning datacontract


    【解决方案1】:

    当您将 IsRequiredtrue 更改为 false 时,这意味着每个调用者都已经在使用该字段中的值。删除 IsRequired 并不会改变它们,因为它们已经包含一个值,因此“不会破坏”。

    然后,您的客户可以决定继续发送给定值或在未来版本的调用您的 WebService 时忽略它。在这种情况下,我不会使用新合同。

    【讨论】:

    • 但是使用 API 的 V1 构建应用程序的人不能将“null”发送到所需的属性吗?即使 V1 文档说该属性是必需的,它仍然会接受 null 作为先前所需属性的有效值,并且用户不会拒绝 Web 服务请求,而是会在堆栈中的某处收到服务器错误。
    • 如果你把它改成IsRequired = false,这意味着你在你的函数中处理空值。如果您不这样做,请将其保留为 IsRequired = true
    • 如果我将其更改为 IsRequired=false,因为 V2 服务方法处理该属性的空值,而服务方法的 V1 实现需要它的值,该怎么办?
    • 在这种情况下,您需要一个新合约,因为您没有重新定义您的功能。您可以修改 IsRequired = false 并将您的功能作为 V1 的“更新”,而不是全新的版本。这就是他们所说的“不间断”
    • 这能回答你的问题吗?还是您需要更多关于 wcf 版本控制的说明?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2023-03-06
    • 2010-10-01
    • 1970-01-01
    • 2019-04-29
    • 2018-03-11
    相关资源
    最近更新 更多