如何在为WCF服务创建代理时摆脱指定的字段?

时间:2015-06-02 13:51:12

标签: c# .net wcf wsdl datacontractserializer

从WCF服务创建代理时,我在服务中声明的每个值类型成员在代理中创建另一个bool类型指定字段。有什么方法可以摆脱这种情况并继续与服务进行交易吗?

我在下面的课程中描述了

public partial class Customer
{
     private int customerIDField;
     public int CustomerID 
     {
         get{ return this.customerIDField; }
         set{ this.customerIDField = value; }
     }
}

创建代理时,我有像这样的代理类

{{1}}

如何在代理中摆脱customerIDFieldSpecified bool类型的成员?以及如何通过仅设置customerIDField来继续服务。

我希望我的代理类就像这样

{{1}}

1 个答案:

答案 0 :(得分:4)

  

我如何摆脱customerIDFieldSpecified bool类型成员   代理?

对于bool,int,decimal类型的类成员或通过服务边界公开的任何XSD兼容值类型,ASMX Web服务曾经常见,除了实际定义之外还要定义等效的...FieldSpecified属性字段包含值。

将其放入生成的代理代码中的原因非常简单:当XmlSerializer将类型序列化为XML时,并且因为在.net中这些类型(如果未指定)返回default values,则生成的消息有效负载将包含bool或decimal / int / etc字段,其值分别为false或0。

现在,如果省略类型中的值,然后将此类型序列化并设置为默认值,则这是不合需要的,因为默认值是实际值,这会产生误导并导致缺陷。因此,为了解决这个问题,引入了...FieldSpecified属性。

这个想法是,如果你想要包含该字段,你还必须将等效的FieldSpecified属性设置为true,这将指示服务端的XmlSerializer将值反序列化(并因此分配)到服务器的表示的类型。如果未指定,则XmlSerializer将跳过等效属性,然后转到XML中的下一个字段。

借助WCF,Microsoft引入了DataContractSerializer,作为XmlSerializer的替代品。 DataContractSerializer在反序列化时不会表现出相同的行为,并且不会尝试将任何值分配给XML中不存在的字段,因此不再需要此额外字段。但是,在某些情况下,当WCF从服务元数据生成客户端代码时,WCF会回退到XmlSerializer,这是我对你如何最终得到它们的猜测。