2012-02-05 32 views
0

我读过这post版本之间的enumaration更改,但它没有帮助我。 我有以下WCF服务:wcf向前兼容性使用枚举

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

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

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

回答

2

根据问题中您所链接的答案,向enum添加新元素不会中断兼容性。

什么会崩溃发送一个枚举值的客户端,在枚举列表中没有该值。

为了仅通过改变服务器端解决此问题:

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

这可能是更多的工作比它的价值,这取决于你有多少客户端和更新它们有多困难。

+0

感谢您的快速回复。 1.我的问题是我已经发布了旧版本,并且我的枚举中没有“未知”值,所以我无法将新值更改为默认值。 2.在最后一个点,你的意思是这个技巧应该发生在WCF的行为或其他地方? – Sean 2012-02-05 14:20:39

+0

第2点它应该发生在你的代码中,就在return语句之前。对于第1点,您可以将其更改为任何现有值?如果旧客户获得新的枚举,那么应该发生什么业务规则? – 2012-02-05 14:31:11

+0

如果一位老客户得到一个新的枚举,我希望忽略它,或者将它切换到我目前没有的默认值。 但是这个解决方案带来了另一个问题 - 一个新客户端将无法使用旧服务,因为它将失败调用'新服务'(旧服务中不存在)。 – Sean 2012-02-05 15:24:35