使用“指定”模式在WSDL中设置minOccurs = 0不起作用

时间:2013-02-08 19:15:56

标签: c# web-services soap wsdl

好的,显然我在这里做错了。我正在尝试创建一个web服务,我希望“dateShipped”是可选的,这意味着在WSDL中,我想要minOccurs =“0”

[Serializable]
[XmlType]
public class CTShipment
{
    [XmlElement(Order = 0, IsNullable=false)] public CTDeliveryMethod DeliveryMethod;
    [XmlElement(Order = 1, IsNullable=false)] public CTShipmentAddress ShipmentAddress;
    [XmlIgnore] public bool dateShippedSpecified;
    [XmlElement(Order = 2, IsNullable=false)] public DateTime dateShipped;
}

我希望生成这样的WSDL:

<xs:complexType name="CTShipment">
  <xs:annotation>
     <xs:documentation>All details for the shipment of a suborder.</xs:documentation>
  </xs:annotation>
  <xs:sequence>
     <xs:element name="DeliveryMethod" type="CTDeliveryMethod" nillable="false"/>
     <xs:element name="ShipmentAddress" type="CTShipmentAddress" nillable="false"/>
     <xs:element name="dateShipped" type="xs:dateTime" nillable="false" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>

相反,我实际得到的是:

<xs:complexType name="CTShipment">
  <xs:sequence>
     <xs:element name="DeliveryMethod" nillable="true" type="tns:CTDeliveryMethod"/>
     <xs:element name="ShipmentAddress" nillable="true" type="tns:CTShipmentAddress"/>
     <xs:element name="dateShipped" type="xs:dateTime"/>
     <xs:element name="dateShippedSpecified" type="xs:boolean"/>
  </xs:sequence>
</xs:complexType>

根据我读过的几件事(包括http://msdn.microsoft.com/en-us/library/zds0b35c%28v=vs.90%29.aspx),包括公共bool“dateShippedSpecified”应该使“dateShipped”可选(minOccurs = 0)。正如您所看到的,不仅这不会发生,而且“dateShippedSpecified”也会出现在WSDL中,即使它标有“[XmlIgnore]”。您可能已经注意到还有另一个问题:即使我指定“IsNullable = false”,我仍然在WSDL中获得nillable =“true”。

这不少于4个问题我无法解释所有与此相关的问题:

  1. 如何在WSDL中将minOccurs设置为0?
  2. 为什么[fieldName]指定的模式不是[fieldName]可选(minOccurs = 0)?
  3. 即使它没有遵循___Specified模式,如果标记为XmlIgnore,为什么dateShippedSpecified会出现在WSDL中?
  4. 为什么即使我指定“IsNullable = false”,所有内容都标记为nillable =“true”?

    作为奖励问题,如果有人知道......

  5. 如何获取要包含的注释(如下所示)?

    <xs:annotation>
     <xs:documentation>All details for the shipment of a suborder.</xs:documentation>
    </xs:annotation>
    

2 个答案:

答案 0 :(得分:2)

这是.net实现中的一个错误。

根据W3C规范(对于wsdl),minOccurs =“0”可以在序列中使用。 “&lt; sequence&gt;” 表示按顺序发生0次或更多次的元素。

例如,查看wsdl的官方W3C定义:http://www.w3.org/TR/wsdl

您将看到以下元素:

<sequence>
         <element ref="wsdl:documentation" minOccurs="0"/>
 </sequence>

现在需要.Net兼容时使用nillable =“true” 哪个会给你DateTime? (可空版本)而不是DateTime。

答案 1 :(得分:1)

这是由于Sequence元素。它指定每个元素都有minOccurs = 1。 并且WSDL使用Sequence-Element而不是“All”,因为您为它们指定了Order。 这要求每个值都存在。

因此,当您删除订单时,它应该全部工作。如果你真的需要订单,那么你就无法忽略这个价值。