WCF合同更改会影响客户端

时间:2009-03-11 02:13:46

标签: wcf datacontract servicecontract operationcontract

我很好奇是否有人可以概述服务器端哪些类型的WCF合同(接口)更改会破坏尝试发送消息的客户端,以及原因。我相信WCF可以处理某些差异,但我不确定你可以安全地改变什么,以及你不能做什么。

  • 在OperationContract中添加/删除参数?
  • 添加/删除/更改DataContract的序列化属性?
  • 从ServiceContract添加/删除OperationContracts?

一位朋友在这里问了一个类似的问题:

Does adding a method to a WCF ServiceContract break existing clients?

编辑:正如John Saunders所指出的那样,改变合同通常不是一个好主意,但是内置的东西允许一些版本容忍(ExtensionDataObject等?)。我只想知道版本容差的灵活性。

5 个答案:

答案 0 :(得分:14)

查看有关dasBlonde的这篇文章:Versioning WCF Service Contracts

它列出了哪些更改会破坏现有客户端:

  1. 删除操作
  2. 更改操作名称
  3. 删除操作参数
  4. 添加操作参数
  5. 更改操作参数名称或数据类型
  6. 更改操作的返回值类型
  7. 通过显式使用.NET属性或自定义序列化代码更改参数类型(数据协定)或操作(消息协定)的序列化XML格式
  8. 修改服务操作编码格式(RPC编码与文档文字)
  9. This article by Michele更详细地解释了如何设计合同以使其更加灵活。

答案 1 :(得分:4)

合同设计建议

  1. 第一个版本

    1.1。仔细选择所有合同(接口,方法,类和属性)的名称。这些在将来的版本中很难改变。

    1.2。请记住,以后不能更改以下内容:方法参数的数量;不受您控制的类型的参数类型/返回值/属性。

  2. 下一个版本

    2.1。如果已存在,请不要更改任何xxxContractAttribute上的Namespace或Name参数。

    2.2。如果已存在,请不要更改DataMemberAttribute的Order属性。

    2.3。只允许以下更改:

    • 将方法(OperationContract)添加到接口(ServiceContract)

    • 在界面上重命名方法

    • 重命名类(DataContract)

    • 将属性(DataMember)添加到类(DataContract)

    • 重命名类

    • 上的属性

    2.4。任何删除都会破坏兼容性。

    2.5。任何其他更改都会破坏兼容性。

  3. 以下是一些有用的链接:

答案 2 :(得分:3)

在WCF中“添加/删除OperationContract中的参数”并不总是会破坏您的客户端,但您必须知道自己在做什么。 特别是,向操作合同添加新参数将导致旧客户端不通过它们,并且在服务端,它们将使用其默认值进行设置。 此外,从客户的角度来看,从操作合同中删除参数将是静默的,并且在服务端将简单地忽略它们。 当然,更改参数的名称/类型将导致客户端中断。

答案 3 :(得分:0)

我认为最佳做法是将合同视为牢不可破,嗯,合同。发布后不要更改它们。使用您想要的更改创建新合同并在新端点上公开新合同很容易。

答案 4 :(得分:0)

行。题。由于错误的命名语法(参数用大写字母指定),我想调整一些代码:

[OperationContract]
public void Foo(string Bar){}

[OperationContract]
public void Foo(string bar){}

会调整资本中断合约吗?