【问题标题】:WCF IsRequired Attribute dilemmaWCF IsRequired 属性困境
【发布时间】:2012-03-15 11:07:13
【问题描述】:

我们正在为一个客户开发一些 WCF 网络服务。我们的消息契约是通过在我们的类及其属性之上使用 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 选项,让他们可以在此成员中传递任何东西,包括零,但是当他们省略时,只有它应该给出错误

【问题讨论】:

    标签: wcf


    【解决方案1】:
    1. 您没有提到您的“期望”结果是什么。我的意思是你想要达到的目标。
    2. 您知道除非绝对必要,否则 MS 不建议将 EmitDefaultValue 设置为 false?请阅读this MSDN page 的最后一部分以了解原因。
    3. 当您将EmitDefaultValue 设置为false 时,为您的服务生成的WSDL 有一些只有WCF 才能理解的注释。即,通过这样做,您可能会限制您的服务的互操作性。这是您的要求吗?

    您的问题的解决方案:

    使您的 DataMember "RequiredValue" 成为可为空的 int。

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多