asmx服务可以返回任何内容而不是null吗?

时间:2009-10-07 18:41:01

标签: .net asp.net web-services asmx

我有一个WebService,我正在维护,在.Net 2.0上运行。它使用原始的“asmx”文件标准进行一系列Web服务。在这些Web服务中,返回的某些对象可能具有大量“null”值。例如:

<user id="1" name="foo" job="null" location="null" audience="null" />

这是一个简单的例子;实际上,我们有更多的“空”值。因为我真的不需要空值,因为我可以很容易地推断出它们不存在它们是空的,我宁愿根本不返回它们。可以这样做吗?如果是这样,怎么样?

编辑添加类定义:

[Serializable]
public partial class User

    [XmlAttribute("Id")]
    public int Id 
    {
        get { return GetColumnValue<int>("ID"); }

        set { SetColumnValue("ID", value); }

    }



    [XmlAttribute("Username")]
    public string Username 
    {
        get { return GetColumnValue<string>("Username"); }

        set { SetColumnValue("Username", value); }

    }
}

顺便说一下,我的目标是:

<user id="1" name="foo" />

4 个答案:

答案 0 :(得分:3)

XmlElementAttribute.IsNullable Property

如果IsNullable属性为false,则不会为已设置为空引用的类成员生成XML元素(在Visual Basic中为Nothing)。

public class MyClass
{
   [XmlElement(IsNullable = false)]
   public string Group;
}

答案 1 :(得分:2)

示例xml令人困惑,因为在大多数情况下,序列化程序省略空值,尤其是对于属性。与元素一起使用时,例外是Nullable<T>,例如:

[XmlElement("job")]
public int? Job { get; set; }

可能导致:

<user ...>
    <job xsi:nil="true" />
</user>

非常与您的示例x​​ml不同。在一般情况下,可以使用多种方法控制序列化:

  • IsNullable
  • [XmlElement]属性
  • 添加[DefaultValue]
  • 添加public bool ShouldSerialize{propname}() {...}方法
  • 添加[XmlIgnore] public bool {propname}Specified {get {...} set {...}}属性

然而;如果没有可重复的示例来运行您的示例,则无法完全回答。


更新更新的问题; 这个应该可以实现这一点,但不清楚这些其他属性是什么(如果为null则不想显示)。

[Serializable, XmlRoot("user")]
public partial class User
{
    [XmlAttribute("id")]
    public int Id {get;set;} // snipped more complex property implementation
    [XmlAttribute("name")]
    public string Username  {get;set;} // ditto
}

答案 2 :(得分:0)

从架构的角度来看,您实际上是在说这些元素是可选的,这可以通过使用DefaultValue属性来实现(至少根据文档)。见http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributes.xmldefaultvalue.aspx

答案 3 :(得分:0)

你确定

 GetColumnValue<string>("Username"); 

返回null而不是空白?这似乎是最可能的解释......