【问题标题】:wcf forward-compatibility using enums使用枚举的 wcf 前向兼容性
【发布时间】:2012-02-05 08:04:55
【问题描述】:

我已经阅读了 post 关于版本之间枚举更改的内容,但这对我没有帮助。 我有以下 wcf 服务:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    MyEnum Foo();
}

[DataContract]
public enum MyEnum
{
    [EnumMember]
    first,
    [EnumMember]
    Second,
}

我正在寻找一种添加新枚举成员的方法,仅限服务端。假设我的客户使用的是旧版本的代理,没有我想添加的新枚举成员。 我的目标是避免序列化异常,我希望我的客户足够聪明来处理这种情况,忽略新值或任何东西。有任何想法吗?

【问题讨论】:

    标签: wcf enums versioning compatibility


    【解决方案1】:

    根据您链接到的问题的答案,向枚举添加新元素不会破坏兼容性。

    会崩溃的是向枚举列表中没有该值的客户端发送枚举值。

    仅通过更改服务器端来解决此问题:

    • 为枚举添加新值
    • 创建与旧服务方法相同的新服务方法
    • 新客户将使用新服务
    • 旧客户端将使用旧服务
    • 在旧服务中,在发送结果之前,检查是否正在使用新枚举值之一,如果是,请将其更改为旧枚举值之一(“Uknown”,如果您有该值)

    这可能比它的价值更多,这取决于您有多少客户以及更新它们的难度。

    【讨论】:

    • 感谢您的快速回复。 1. 我的问题是我已经发布了旧版本,并且我的枚举中没有“未知”值,所以我无法将新值更改为默认值。 2. 在最后一个点中,您的意思是这个技巧应该发生在 WCF 行为中还是其他地方?
    • 对于第 2 点,它应该发生在您的代码中,就在 return 语句之前。对于第 1 点,您可以将其更改为任何现有值吗?如果老客户得到一个新的枚举,业务规则是什么?
    • 如果一个老客户得到一个新的枚举,我想忽略它,或者将它切换为我目前没有的默认值。但是这个解决方案带来了另一个问题 - 新客户端将无法使用旧服务,因为它将无法调用“新服务”(旧服务中不存在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多