WCF中的请求和响应范例

时间:2010-09-22 23:55:08

标签: .net wcf

最近我在一篇文章中读到,在WCF中设计OperationContracts时,下面的方法1比方法2更优选/更有利。

方法1

[OperationContract()]
ResponseMessageType SomeOperation1 (RequestMessageType reqMessage);

方法2

[OperationContract()]
string SomeOperation2 (string parm1, string parm2);

我可以理解,任何参数列表中的任何未来更改/任何参数的类型,返回类型都将在Message Contract(RequestMessageType和ResponseMessageType)中完成。

但我无法意识到它如何成为一种优势?

如果有任何改变意图,必须在某处进行;如果我们在运营合同或消息合同中这样做会有什么不同。

我想了解并认识到第一种方法的优点。

1 个答案:

答案 0 :(得分:4)

我认为在数据合同中这样做的好处是,在不破坏与旧客户端的兼容性的情况下,更容易修改现有数据合同。

假设您要将其他信息返回给调用者。使用简单的数据协定,只需添加一个额外的字段。老客户会忽略它。如果您希望新客户能够与旧服务器通信,只需将该字段设为可选字段。

我不知道如何在服务合同中这样做,而不引入新的服务合同或至少新的运营合同。实施起来不会困难得多,但会使界面更加混乱。

因此,您拥有“灵活”的数据合同(可能包含许多可选字段),而不是冗余操作混乱的服务合同。

这是妥协,但我赞成在大多数情况下使用“灵活”的数据合同。

例外情况是,如果您同时控制客户端和服务器,并且可以轻松确保每个客户端都是最新的。在这种情况下,只需修改(并理想地重命名)您喜欢的任何合同,并放弃对旧合同的支持。

BTW:另一个方向非常相似。您还可以在客户端发送到服务器的数据协定中包含其他(可选)字段。也许新客户希望添加一些可以加快处理速度的提示。或者添加其他数据,这些数据不是完成某些操作所必需的,但服务器可以将其存储在日志中以帮助进行故障排除等。