在我的WCF中,我将对象“Product”定义如下:
<xs:complexType name="Product">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Postcode" type="xs:string" nillable="true" minOccurs="0"/>
<xs:element name="ProductID" type="xs:string" />
</xs:sequence>
</xs:complexType>
请注意元素“Postcode”是nillable =“true”minOccurs =“0”,这意味着当客户端应用程序调用Web服务时,它们可以为此元素提供空值,如下所示:
<Product>
<Name>Product 1</Name>
<Postcode></Postcode>
<ProductID>10</ProductID>
</Product>
或者他们可以简单地跳过“邮政编码”元素,这样传入的邮件就变成了这个(邮政编码不存在)
<Product>
<Name>Product 1</Name>
<ProductID>10</ProductID>
</Product>
我的问题是,在我的主机程序中,如何检查传入的XML消息中是否存在元素“Postcode”?我问,因为如果它不存在,我调用该方法获取Postcode值,那么程序将抛出一个错误:
string postcode = product.Postcode - 此调用会抛出错误吗?
非常感谢你们的任何想法/建议。
查尔斯
答案 0 :(得分:0)
在断言中,你的定义中使用nillable允许你列出的两个案例是不正确的。
实际上,nillable xsd属性允许构造:
<Postcode xsi:nil='true'/>
来自Postcode的semantically different是空的,或根本不存在。
回答你的问题,
如何检查传入XML中是否存在元素“Postcode” 消息
我不太明白你为什么要用minOccurs = 0来定义Postcode。当wcf通过线路接收此类型时,它将尝试反序列化为预定义的C#类型。在C#中,类型具有属性或者没有属性。
例如
public class Product
{
public string Postcode { get; set; }
}
与
不一样public class Product
{
}
因此,通过允许调用者构建您的Product类型的两个不同版本,您实际上被迫定义两个单独的C#类型以反序列化,这意味着您需要两次公开您的服务操作,一次对于想要使用的调用者带有邮政编码的产品,以及一个不想使用产品的人。
我建议你重新定义你的产品类型以包含Postcode元素 - 毕竟因为它是一个字符串,你的调用者如果不想使用它就可以将它保留为null。