代码之家  ›  专栏  ›  技术社区  ›  Dean Johnston

如何强制wcf使用xs:all而不是xs:sequence,以使SOAP元素排序不相关?

  •  7
  • Dean Johnston  · 技术社区  · 15 年前

    当wcf在web服务的wsdl/xsd中定义复杂的对象类型时,如何使它使用xs:all而不是xs:sequence?

    我遇到的问题是xs:sequence要求调用应用程序按照wcf生成的xsd中指定的顺序传递SOAP消息中的元素(默认情况下,这是按字母顺序排列的)。xs:all(或选择)不关心订单。

    这种行为是否可以通过某个地方的配置选项来改变?

    3 回复  |  直到 10 年前
        1
  •  3
  •   Philippe    15 年前

    从我的头上看,我认为你不能。相反,你可以做的是手工编写WSDL文件,然后使用svcutil.exe生成代码。

    如果您只想按不同于字母顺序的顺序排列元素,则可以使用[datamember]属性([datamember(order=1)]、[datamember(order=2)]等上的order(从1开始,而不是从0开始)参数对datacontract中的元素进行排序。

        2
  •  2
  •   Eugene Osovetsky    15 年前

    可以切换WCF以使用XmlSerializer而不是DataContractSerializer。XmlSerializer支持xs:all。见 http://msdn.microsoft.com/en-us/library/ms733901.aspx

        3
  •  0
  •   Abacus painotpi    10 年前

    即使您可以强制WCF这样做,反序列化程序也无法正确工作以支持输入。示例和解释如下。

    输入1(好):

    <MyOperation>
      <AField>value A</AField>
      <BField>value B</BField>
    </MyOperation>
    

    输入2(坏):

    <MyOperation>
      <BField>value B</BField>
      <AField>value A</AField>
    </MyOperation>
    

    因此,如果输入1被正确反序列化,那么输入2将不会——bField将具有设置的值,但属性afField将为空。

    如果wcf不能处理这种无序输入,我强烈认为它应该抛出一个异常,但是基于我的测试(在IIS中为.NET 3.5),它不这样做,它只是跳过一些元素值。

    此外,wcf还忽略完全虚假的输入,只要它不影响它正在寻找的有效元素值。所以这个输入

    <MyOperation>
      <bogusField>with or without data</bogusField>
      <AField>value A</AField>
      <bogusField2 />
      <BField>value B</BField>
      <bogusField3></bogusField3>
    </MyOperation>
    

    不会引发任何错误,实际上会反序列化afield和bfield中的值。