我们正试图迁移到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显然将这些添加到代理中......
答案 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来生成代理。