如何在为WCF服务创建代理时摆脱指定字段
本文关键字:字段 代理 创建 WCF 服务 | 更新日期: 2023-09-27 17:52:48
从WCF服务创建代理时,我在服务中声明的每个值类型成员在代理中创建了一个bool类型指定字段。我有什么办法可以摆脱这个并继续与服务进行交易吗?
我有以下等级的在役描述为
[DataContract]
public class Customer
{
private int customerID;
[DataMember]
public int CustomerID
{
get { return customerID; }
set { customerID = value; }
}
}
创建代理时,我有这样的代理类
public partial class Customer
{
private int customerIDField;
private bool customerIDFieldSpecified;
public int CustomerID
{
get { return this.customerIDField; }
set { this.customerIDField = value; }
}
}
我如何摆脱customerIDFieldSpecified bool类型的代理成员?以及如何通过仅设置customerIDField来继续服务。
我希望我的代理类是这样的
public partial class Customer
{
private int customerIDField;
public int CustomerID
{
get{ return this.customerIDField; }
set{ this.customerIDField = value; }
}
}
如何摆脱customerIDFieldSpecified bool类型成员在代理吗?
在ASMX web服务中,对于在服务边界上公开的bool、int、decimal或任何XSD兼容值类型的类成员,除了包含值的实际字段外,还定义了等效的...FieldSpecified
属性,这在过去是很常见的。
将其放入生成的代理代码中的原因非常简单:当XmlSerializer将类型序列化为XML时,由于在.net中这些类型(如果未指定)返回默认值,因此结果消息有效负载将包含bool或decimal/int/etc字段,其值分别为false或0。
现在,如果您省略了类型中的一个值,然后该类型被序列化并设置为它的默认值,那么这是不可取的,因为默认值是实际值,这会产生误导并导致缺陷。为了解决这个问题,我们引入了...FieldSpecified
性质。
思路是,如果希望包含字段,还必须将等效的FieldSpecified属性设置为true,这将指示服务端的XmlSerializer将值反序列化(并因此分配)到该类型的服务器表示中。如果未指定此属性,则XmlSerializer将跳过等效属性,直接移到XML中的下一个字段。
在WCF中,微软引入了DataContractSerializer,作为XmlSerializer的替代品。DataContractSerializer在反序列化时不会表现出相同的行为,并且不会尝试将任何值赋给XML中不存在的字段,因此不再需要这个额外的字段。然而,在某些条件下,当WCF从服务元数据生成客户端代码时,它会依赖XmlSerializer,这是我猜测您最终使用它们的原因。