【问题标题】:Why does a Web Service DataMember's Specified Attribute need to be set for int and Data but not for String为什么需要为int和Data设置Web服务DataMember的Specified Attribute而不为String设置
【发布时间】:2009-06-26 09:04:29
【问题描述】:

我已经通过 WCF 创建了一个 Web 服务。然后我将它公开为一个 Web 服务,以使其可用于 .NET 2.0 应用程序。我使用 DataMember 创建了一些 DataContract,可用于公开的 OperationContract。

我注意到,当我尝试创建要在 Web 服务中传递的 DataClass 时,每个 DataContract 属性现在对于每个成员都有一个合作伙伴“指定”属性。

例如:

[DataContract]
public class Sales
{

  [DataMember]
  public int InvoiceNo;

...
}

当我在 Web 服务客户端中创建 Sales 实例时。我得到名为 InvoiceNo 和 InvoiceNoSpecified 的属性。

现在这里是我的问题,当属性是string类型时,我不需要设置对应的“Specified”属性为true,但是当属性类型是int或DateTime时,如果我不设置对应“指定”属性为 true,该值在 Web 服务主机中变为空。有没有办法避免设置 Specified 属性?因为我需要在代码中的很多地方调用 Web 服务函数。真的很难跟踪所有这些。

【问题讨论】:

    标签: web-services wcf .net-2.0


    【解决方案1】:

    DataMember 属性的默认参数是:

    bool EmitDefaultValue (default true)
    bool IsRequired (default false)
    

    如果您要公开的属性是不可为空的值类型,您应该使用:

    [DataMember(IsRequired = true)]
    public int InvoiceNo;
    

    【讨论】:

      【解决方案2】:

      你可以阅读解释here

      引用XmlSerializer:

      如果架构包含一个元素 是可选的(minOccurs = '0'),或者如果 架构包含一个默认值, 你有两个选择。一种选择是 采用 System.ComponentModel.DefaultValueAttribute 指定默认值,如图 在下面的代码中。另外一个选项 就是用一种特殊的图案来创造 被识别的布尔字段 XmlSerializer,并应用 XmlIgnoreAttribute 到字段。这 模式以以下形式创建 属性名称指定。例如,如果 有一个名为“MyFirstName”的字段 您还将创建一个名为 “MyFirstNameSpecified”指示 XmlSerializer 是否生成 名为“MyFirstName”的 XML 元素。

      到目前为止,我唯一可以接受的解决方法是通过使用XmlSerializerFormatAttribute 来使用XmlSerializer 而不是DataContractSerializer

      【讨论】:

      • 我尝试为此使用 DefaultValueAttribute。当我使用默认值时,即使我在客户端中设置了日期参数的值,也会发生这种情况。由于我不再设置 dateSpecified = true ,因此日期值始终是默认值。 // 客户端代码 prm.DepositDate = dtp_Deposit.Value.Date; // 服务代码 [DefaultValue(typeof(DateTime), "1900/01/01")] public DepositDate;
      • 谢谢哥们。我对 python soaplib 服务和 .net 客户端有同样的问题。我总是必须将 Specified 设置为 true。这是一个如何在 Python 中修复它的示例:@rpc(soap_types.Int(min_occurs = 1), _returns=soap_types.String)
      【解决方案3】:

      你也可以使用[DataMember(isRequired=True)]

      【讨论】:

        猜你喜欢
        • 2019-04-15
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多