WCF需要属性困境

时间:2012-03-15 11:07:13

标签: wcf

对于客户,我们正在开发一些WCF Web服务。我们的消息契约是通过在类及其属性之上使用DataContract和DataMember属性来定义的。 DataMember属性具有一些额外的属性,允许我们添加一些额外的规则。例如,如果属性应始终可用,我们使用(IsRequired = true);表明这一点。收到或发送邮件时会检查这些规则。

[DataContract]
public class TestClass      
{  
    [DataMember(IsRequired = true)]  
    public int RequiredValue { get; set; }      
}

然而,在我们的测试中,我们注意到它不起作用,因为在客户端,RequiredValueField被初始化为null,所以在一些读数中我发现了这个属性,EmitDefaultValue = false,所以通过使用两者,我得到了期望的结果

[DataContract]  
public class TestClass  
{  
        [DataMember(IsRequired = true, EmitDefaultValue=false)]  
        public int RequiredValue { get; set; }  
} 

但是假设,如果某个客户端初始化RequiredValue = 0然后调用服务方法,则会再次出错。 那么如何释放我的APIusers,并选择他们可以传递此成员中的任何内容,包括零,但是当它们省略时,只有它应该给出错误

1 个答案:

答案 0 :(得分:1)

  1. 您没有提到您的“期望”结果。我的意思是你想要实现的目标。
  2. 您是否知道MS不建议将EmitDefaultValue设置为false,除非绝对必要?请阅读this MSDN page的最后一节以了解原因。
  3. 当您将EmitDefaultValue设置为false时,为您的服务生成的WSDL具有一些注释,这些注释仅由WCF理解。即通过这样做,您可以限制您的服务的互操作性。这是你的要求吗?
  4. 解决您的问题:

    使您的DataMember“RequiredValue”成为可以为空的int。

    [DataMember(IsRequired = true,EmitDefaultValue=false)]  
        public int? RequiredValue { get; set; }
    

    通过这样做,RequiredValue数据成员的默认值将为null,您将能够毫无问题地设置零(0)。