为什么WCF服务方法的参数设置为正确的值

时间:2016-04-20 16:36:38

标签: c# wcf

如果我的WCF服务包含一个看起来像这样的方法......

  [OperationContract]
  public void Jim(int ID) {
    // DO SOMETHING HERE
  }

...我在客户端使用此方法,一切正常。

如果我随后将服务方法的参数重命名为id,那么当调用服务方法时,参数未设置,因此值为零。

如果我在客户端重新生成服务引用,则参数设置正确。

我不明白为什么这部分有效。我原以为它可以完全工作(即将参数设置为正确的值),或者因异常而失败。

如果传入的请求被识别为相同的方法,那么它应该已经识别了参数名称并设置了值。如果它与参数名称不匹配,那么它应该被视为一个不同的方法,并抛出一个它想要的方法丢失的异常。我不明白为什么它调用了正确的方法,但没有设置参数值。

任何人都可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

在SOAP服务中,参数名称实际上将包含在为操作生成的XSD中。这意味着除非您更新客户端的服务引用,否则它的操作定义仍将包含旧的参数名称。当WCF通过线路将值从客户端序列化到服务器时,由于名称不匹配,客户端的参数值将无法正确序列化。

这样想:

客户端根据其服务引用将操作和参数打包成XML文档,然后将其作为请求发送到服务器。这是序列化。

服务器基于它的服务引用现在需要为请求解包XML并找出要做的事情。它解包该操作并将其与其服务引用中的已知操作列表进行比较;它看到您正在请求名为Jim的操作,该操作需要一个字符串参数。然后,它会查看XML文档中针对任何传递值的该操作的任何/所有参数值。这是反序列化。在您的情况下,客户端传递的参数的名称值与服务的预期值不同。它将无法在XML中找到该值,也不会设置该值。

为了使事情正常运行,客户和服务必须就服务参考定义达成一致并匹配。

This描述了WCF数据合同和序列化,值得一读。