从请求中省略的WCF字符串数据成员默认为NULL而不是String.Empty

时间:2014-03-19 15:02:31

标签: c# web-services wcf soap

我将以下数据成员定义为数据协定的一部分,该数据协定从WOB方法的客户端传递到服务器。此数据协定用于服务器端;客户端是第三方供应商,他们很可能甚至不使用WCF并且正在使用Java客户端等。这是一个SOAP服务。

[DataMember(Name = "PhoneType", IsRequired = false)]
public string PhoneType { get; set; }

我原以为设置IsRequired = false时,这意味着您可以完全省略SOAP请求中的元素,而PhoneType的值默认为String.Empty。但是,这没有发生。

我在使用lead.PhoneType.Equals(somestring)时遇到异常,因为lead.PhoneType是一个空引用。当然,最简单的方法是首先检查NULL,但为什么它首先是null?我发现如果您在SOAP请求中包含<ns:PhoneType />,则lead.PhoneType设置为String.Empty,但如果您从请求中完全排除该元素,那么lead.PhoneType是空值。不应该默认为String.Empty吗?我是否误解了WCF如何处理未包含在请求中的可选数据成员?

1 个答案:

答案 0 :(得分:1)

如果声明了字符串变量但未设置它,则它将为null而不是string.Empty。这就是语言运作的方式。

在.NET中,字符串是引用类型而不是值类型,因此没有默认值。如果没有默认值,则该值为null。这是应该的。