小心,WCF接口中的参数改名问题

本文来自Kevin Yang博客 作者:Kevin Yang

在快速开发的过程中,时常会图快而忽视变量的命名问题。结果开发后期发现自己起的名字非常难读,要不就是由错别字之类的问题。程序员大多都有一点完美主义情绪,对于这样的情况自然无法视而不见,还好Visual Studio对于变量命名的重构非常便捷,直接在变量定义处修改名字之后按下Ctrl+.号(由于这个快捷键和大多数拼音输入法冲突,建议改成Ctrl+;)会弹出smarttag菜单,选择Rename all referrence即可。

不过你需要小心的是,在写WCF Web Service接口的时候,如果你对接口的参数名做改动的时候,一定要记住Update所有应用该Web service的客户端的Referrence,否则传入的变量就会变成默认值,这是因为WCF中将参数名也作为契约的一部分

例如我写了这么一个Web Service接口String GetAccountName(int account)。本来是正常运行的,但是如果重命名参数account=>accountKey,又没有Update Referrence的话,那么无论你客户端传入的accountKey是多少,服务端收到的总是0。

如果你在开发中遇到调用Web Service时参数的值没能正确传到服务端这样的问题,那么在检查是否漏掉了[DataContract] 或是 [DataMember] 这样的序列化属性之后,你可能需要检查一下是否更改了参数的名称,或者干脆就直接Update一下referrence。

如果想要重构但是不想改动客户端代码的话,那么你可以给参数加上一个MessageParameter的属性,代码如下:

String GetAccountName([MessageParameter(Name="account")]int accountKey)

这样你契约中使用的参数名还是account,但是你在服务端使用的名称已经变更为accountKey了。