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

siv*_*n B 1 .net c# wcf wsdl datacontractserializer

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

我在服务中描述了以下课程

[DataContract]
public class Customer
{
    private int customerID;

    [DataMember]
    public int CustomerID
    {
        get { return customerID; }
        set { customerID = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public partial class Customer
{
     private int customerIDField;

     private bool customerIDFieldSpecified;
     public int CustomerID 
     {
         get { return this.customerIDField; }
         set { this.customerIDField = value; }
     }
}
Run Code Online (Sandbox Code Playgroud)

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

我希望我的代理类是这样的

public partial class Customer
{
     private int customerIDField;
     public int CustomerID 
     {
         get{ return this.customerIDField; }
         set{ this.customerIDField = value; }
     }
}
Run Code Online (Sandbox Code Playgroud)

tom*_*ern 5

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

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

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

现在,如果你在一个类型中省略一个值,然后这个类型被序列化并设置为它的默认值,那么这是不可取的,因为默认值是实际值,这会产生误导并且会导致缺陷。因此,为了解决这个问题,...FieldSpecified引入了该属性。

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

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