.net WCF中的请求与响应范式

.net WCF中的请求与响应范式,.net,wcf,.net,Wcf,最近我在一篇文章中读到,在WCF中设计运营合同时,以下方法1比方法2更可取/更有利 方法1 方法2 我可以理解,任何参数、返回类型的参数/类型列表中的任何未来更改都将在消息契约(RequestMessageType和ResponseMessageType)中完成 但我不知道这怎么会成为一种优势 如果有任何更改,必须在某个地方进行;如果我们在操作合同或消息合同中这样做,会有什么不同 我想了解并认识到第一种方法的优点。我认为在数据契约中这样做的优点是,在不破坏与旧客户端的兼容性的情况下,修改现有数据

最近我在一篇文章中读到,在WCF中设计运营合同时,以下方法1比方法2更可取/更有利

方法1

方法2

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

但我不知道这怎么会成为一种优势

如果有任何更改,必须在某个地方进行;如果我们在操作合同或消息合同中这样做,会有什么不同


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

我认为在数据契约中这样做的优点是,在不破坏与旧客户端的兼容性的情况下,修改现有数据契约更容易

假设您想向调用者返回附加信息。使用简单的数据契约,只需添加一个附加字段。老客户只会忽略它。如果您希望新客户机能够与旧服务器通信,只需将字段设置为可选字段

如果不引入新的服务合同或至少是新的运营合同,我不知道如何在服务合同中做到这一点。实现不会困难很多,但会使接口更加混乱

因此,您有“灵活”的数据契约(可能有许多可选字段)和充斥着冗余操作的服务契约

这是一个折衷方案,但我倾向于在大多数情况下使用“灵活”的数据契约

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


顺便说一句:另一个方向非常相似。您还可以在客户机发送到服务器的数据协定中包含其他(可选)字段。也许新客户想要添加一些可以加快处理速度的提示。或者添加完成某些操作不需要的额外数据,但服务器可以将其存储在日志中以帮助进行故障排除或其他任何操作。

我认为在数据协定中这样做的好处是,修改现有数据协定更容易,而不会破坏与旧客户端的兼容性

假设您想向调用者返回附加信息。使用简单的数据契约,只需添加一个附加字段。老客户只会忽略它。如果您希望新客户机能够与旧服务器通信,只需将字段设置为可选字段

如果不引入新的服务合同或至少是新的运营合同,我不知道如何在服务合同中做到这一点。实现不会困难很多,但会使接口更加混乱

因此,您有“灵活”的数据契约(可能有许多可选字段)和充斥着冗余操作的服务契约

这是一个折衷方案,但我倾向于在大多数情况下使用“灵活”的数据契约

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


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

我同意@pgroke的观点,通过使用数据契约,您将获得更大的灵活性。但是,如果您不能控制客户机(即,您的客户机无法重建)。然后,您还需要考虑数据契约版本控制。这些文章将为您指明正确的方向:我同意@pgroke的观点,您将通过使用数据契约获得更大的灵活性。但是,如果您不能控制客户机(即,您的客户机无法重建)。然后,您还需要考虑数据契约版本控制。这些文章将为您指明正确的方向:以及
[OperationContract()]
ResponseMessageType SomeOperation1 (RequestMessageType reqMessage);
[OperationContract()]
string SomeOperation2 (string parm1, string parm2);