【问题标题】:Ignoring XSD Sequence Order on Serialization in .NET忽略 .NET 中序列化的 XSD 序列顺序
【发布时间】:2015-04-03 06:28:16
【问题描述】:

我正在使用 .NET 中的第 3 方 Web 服务(我无法控制它)。

我注意到一些在响应返回并从服务中序列化时没有设置。

我注意到他们的反应有些奇怪。

这是他们的 WSDL 示例

<xs:complexType name="letters">
    <xs:complexContent>
        <xs:extension base="tns:response">
            <xs:sequence>
                <xs:element name="a" type="xs:long" />
                <xs:element minOccurs="0" name="b" type="xs:dateTime" />
                <xs:element maxOccurs="unbounded" minOccurs="0" name="c" nillable="true" type="tns:anotherComplexType" />
                <xs:element minOccurs="0" name="d" type="xs:dateTime" />
                <xs:element minOccurs="0" name="e" type="tns:string" />
                <xs:element minOccurs="0" name="f" type="tns:boolean" />
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

这是响应相关部分的示例:

<letters>
    <a>0</a>
    <b>2015-02-03T11:59:18+11:00</b>
    <d>2015-02-03T12:00:00+11:00</d>
    <f>true</f>
</letters>

我怀疑因为他们为&lt;letters&gt; 部分中的元素定义了&lt;xs:sequence&gt;,所以.NET 序列化程序期望响应中包含ALL 元素? (因此,他们的响应违反了他们的 WSDL 定义?)。

谢谢

编辑 似乎响应正在返回一个未知元素,特别是

<letters>
    <a>0</a>
    <b>2015-02-03T11:59:18+11:00</b>
    <d>2015-02-03T12:00:00+11:00</d>
    <otherElement>blue</otherElement>
    <f>true</f>
</letters>

这不是 WSDL 的一部分。这意味着&lt;f&gt; 元素没有被序列化。有没有办法让我忽略未知元素?

【问题讨论】:

    标签: .net xml web-services xsd


    【解决方案1】:

    不,xsd:sequence 仅表示元素必须有序。每个xs:element 上的@minOccurs 属性表示必需性。 @minOccurs = 0 时,该元素是可选的。(注意@minOccurs@maxOccurs 的默认值是1,表示“必需”。)由于该序列中的许多元素是@minOccurs = 0,您的回复中不必包含所有元素。

    【讨论】:

    • 谢谢,这在我原来的问题的上下文中是正确的,但似乎他们在回复中返回了一个未知元素。有什么可以忽略的吗?
    • 如果他们返回的响应包含 WSDL 响应 XSD 不允许的元素,那么他们违反了接口契约。告诉他们修复他们的代码或修复他们的 XSD。
    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2014-05-13
    • 2016-06-16
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多