WCF开发之版本相容性

因为我们会一直更新WCF服务或者扩展新的WCF服务,那么就不得不面对一个问题--WCF的版本控制问题。

一旦发布,WSDL契约就被确定
– 必须支持向后兼容
在理论上,策略可以发生变更
– 新的安全策略
– 附加的可靠性特性
– 策略使用元数据交换来发现
如果客户端能够动态地处理变化,那么仅仅改变策略是安全的

版本相容性
• WCF契约缺省是提供版本相容性支持的
• 所有的服务契约,数据契约与消息契约:
– 允许缺失,非必需(non-required)的数据存在
– 可以忽略多余的数据
• DataContractSerializer提供相容性支持
• 适当的变化并不会对现存的客户端或者服务端产生影响

下面的表格详细的说明了服务契约变化后对于客户端的各种影响:

服务契约的变化 服务契约的变化对现存客户端的影响
在操作签名上添加新的参数
  • 客户端不会被影响
  • 新的参数在服务中被初始化为缺省值
从操作签名中删除参数
  • 客户端不会被影响
  • 客户端传递的多余参数将被忽略,这些数据在服务端被丢失
修改参数类型
  • 如果从客户端进入的类型无法转换为参数的数据类型,将会抛出异常
修改返回值类型
  • 如果从服务端返回的值无法转换为在客户端操作签名中所期望的数据类型,那么将会抛出异常
添加新操作
  • 客户端不会被影响
  • 由于客户端不知道新加入操作的存在,因此其不会被调用
删除操作
  • 抛出异常
  • 客户端发送给服务端的消息会被认为使用了未知的action头
添加新的non-required成员
  • 客户端不会被影响
  • 新的参数在服务中被初始化为缺省值
添加新的required成员
  • 对于缺少的值,将会抛出异常
删除non-required成员
  • 服务端数据丢失
  • 无法将全部数据集返回给客户端
  • 不会抛出异常
删除required成员
  • 当客户端收到来自服务端带有缺失数据的响应时,将会抛出异常
修改已存的成员的数据类型
  • 如果类型兼容,那么不会产生异常,但是可能会导致未知的结果

现在描述一个场景比如说,我们在服务端添加一个required的DataMember成员,然后重新发布这个WCF服务,但是客户端不更新WCF的服务引用,在这种情况下当客户端调用WCF服务的时候WCF就会抛出一个缺少必要数据的异常。如果添加的是一个non-required的成员,那个就不会抛出异常,客户端可以正常使用。这就是所谓的版本相容性,当然实际开发中还有很多情况,只要多测试也就没有问题了。(完)

posted @ 2010-02-09 14:03  烟鬼  阅读(1090)  评论(1编辑  收藏  举报