9

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

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

有朋友在这里问过类似的问题:

向 WCF ServiceContract 添加方法会破坏现有客户端吗?

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

4

5 回答 5

16

查看 dasBlonde 上的这篇文章:版本化 WCF 服务合同

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

  1. 删除操作
  2. 更改操作名称
  3. 移除操作参数
  4. 添加操作参数
  5. 更改操作参数名称或数据类型
  6. 更改操作的返回值类型
  7. 通过显式使用 .NET 属性或自定义序列化代码更改参数类型(数据协定)或操作(消息协定)的序列化 XML 格式
  8. 修改服务操作编码格式(RPC Encoding vs. Document Literal)

Michele 的这篇文章更详细地解释了如何设计更灵活的合约。

于 2009-03-11T02:31:51.220 回答
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. 任何其他更改都会破坏兼容性。

以下是一些有用的链接:

于 2012-06-27T09:05:44.843 回答
3

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

于 2013-09-23T14:04:54.597 回答
1

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

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

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

会调整资本违约合同吗?

于 2016-09-16T13:28:27.153 回答
0

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

于 2009-03-11T02:20:19.763 回答