如何在为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; }
     }
}

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

如何摆脱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,这是我猜测您最终使用它们的原因。