从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}}
答案 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,这是我对你如何最终得到它们的猜测。