如何使用VS 2010 vs VS 2008处理WCF服务中“指定”字段的差异?

时间:2011-02-11 16:57:47

标签: wcf visual-studio-2008 visual-studio-2010

我们正试图迁移到VS 2010,我们注意到我们的WCF服务有些奇怪的行为。

在VS 2008中,当我添加给定的WCF服务引用时,对于不是引用类型的每个对象字段,对象浏览器显示fieldNameSpecified bool属性。我知道这是存在的,因此有一种方法可以确定从服务返回的值是否实际上具有值,因为DateTime,int等不能为空。

当我尝试在VS 2010中添加相同的引用(设置为.Net 3.5)时,缺少所有这些fieldNameSpecified字段。我们在VS 2008中编写的代码会查看这些fieldNameSpecified字段,这些字段会导致我们的应用在尝试使用VS 2010时被破坏(因为VS 2010中生成的代理没有这些fieldNameSpecified字段)。

有没有办法让VS 2010重新放入这些指定的字段?是否有其他解决方案不需要我们重写代码?

此外,正确的VS 2010确定值类型字段(int或DateTime)是否实际上具有从服务返回的有效数据的方式是什么?

非常感谢任何帮助!

澄清:fieldNameSpecified字段不是WSDL的一部分。为了方便起见,VS 2008显然将这些添加到代理中......

4 个答案:

答案 0 :(得分:5)

我最近遇到了相反的情况。以前没有任何xxxspecified字段,但现在他们出现了。我们只使用过VS2008。这实际上导致可选字段的值未传递给客户端应用程序,因为xxxspecified字段默认为false。

如果您查看服务引用下的两个版本的自动生成的reference.cs文件,您应该注意到差异。一个使用DataContractSerializer,另一个使用XMLSerializer。

添加服务引用时,如果您使用服务的网址,例如http://localhost/MyService.svc,它将使用DataContractSerializer。如果您使用WSDL的URL,例如http://localhost/MyService.svc?wsdl,它将使用XMLSerializer。

答案 1 :(得分:1)

您也可以使用名为EmitDefaultValue的属性来解决您的问题。请遵循以下说明:

http://bukovics.wordpress.com/2007/03/23/exposing-nullable-fields-to-net-11-web-service-clients/

这也解释了为什么你得到fieldNameSpecified属性。这正是您解决问题所需要的。

答案 2 :(得分:0)

据我了解,如果数据合同需要属性(例如,如果您使用[DataMember(IsRequired=true)]属性),则不会自动生成“指定”字段。不幸的是,使字段不需要需要更改代码,但至少在客户端不会这样做。

允许调用者不能指定参数的另一种方法(不知道它是否比“指定”字段更多VS 2010)是使用Nullable<>类型。

答案 3 :(得分:0)

我还没有测试过,但也许您可以删除服务引用,而是在项目中预先构建一个步骤来运行旧版本的WSDL.exe来生成代理。