为什么接收太多参数的WCF服务没有破坏?

时间:2014-04-29 11:43:14

标签: c# asp.net wcf

好的,这是一个奇怪的问题。我在项目中遇到了一段代码,它以编程方式创建基于接口的ChannelFactory。接口中的方法有三个参数。现在,当我查看实际的WCF服务代码时,该方法只需要两个参数,但是从客户端发送三个参数。

我希望服务在收到额外参数时中断,但它没有。有谁知道为什么这个有效?

2 个答案:

答案 0 :(得分:5)

服务呼叫被编码到线路上并发送到接收器。根据XML / Binary / Json解析器的严格程度,可以忽略额外的参数。

当WCF服务器上的存根代码接收到有线调用时,它不会覆盖序列化数据包并说“#34;他们正在调用MethodX,我得到了param1,param2和param3 - 让我们尝试填充他们在方法里面......哦。它只需要param1和param2。 。吊杆"

相反,它说的是: "他们称为MethodX。大。它需要什么参数? Param1和Param2。让我们看看这些是否存在于数据包中。哦!他们在这里。甜。我会用它们。"它完全忽略了其余部分。

一些注意事项:

  1. 如果存在额外的东西,写一个会失败的存根并不困难。例如,WCF将在一些额外的东西上失败,而不会在其他东西上失败。
  2. 这样做有一个好处,你可以向前和可能向后兼容(即客户端V2与服务器V1通信仍然有效,只是忽略参数[你可能想要或不想要])。

答案 1 :(得分:1)

WCF有Forward Compatible Data Contracts

如果服务合同继承自IExtensibleDataObject,则服务行为是存储而不是在找到额外的输入数据时抛出错误。

  

当WCF基础结构遇到不属于的数据时   原始数据合同,数据存储在属性和   保存。除临时情况外,不会以任何其他方式处理   存储。如果对象返回到它发起的位置,那么   还返回原始(未知)数据。因此,数据已经做出   往返起点的往返往返,无损失。