.NET SOAP序列化无界序列

时间:2011-12-01 17:56:52

标签: c# wcf xml-serialization wsdl service-reference

我们有一个包含以下类型定义的WSDL:

...
<xsd:complexType name="OrderItem">
  <xsd:all>
    <xsd:element name="source" type="xsd:string" />
  </xsd:all>
</xsd:complexType>
<xsd:complexType name="OrderItems">
  <xsd:sequence>
    <xsd:element name="item" type="tns:OrderItem" maxOccurs="unbounded" />
  </xsd:sequence>
</xsd:complexType>
...

在VS 2010中将服务添加为服务引用时,OrderItems类包含item属性,类型为OrderItem[]。然后生成SOAP请求,如下所示:

...
<items>
  <OrderItem>
    <item>foo</item>
    <item>bar</item>
  </OrderItem>
</items>
...

使用XmlArrayXmlArrayItem属性,我们可以分别控制<OrderItem><item>元素的名称,但无法达到所需的结构:

...
<items>
  <item>foo</item>
  <item>bar</item>
</items>
...

我知道如果WSDL指定类似<xsd:restriction base="soap-enc:Array">而不是无限制序列的话,可以避免这个问题,但鉴于上述是使用某些自定义序列化的唯一方法吗?

编辑https://gist.github.com/1422704

的示例WSDL

1 个答案:

答案 0 :(得分:1)

似乎.NET WCF服务与我们的WSDL不一致(它是手动创建的,重点是XSD而不是SOAP)。

使SOAP API与.NET一起使用的最简单方法是更改​​WSDL以使用SOAP数组类型,因此<items>变为soap-enc:Array soap-enc:arrayType="tns:OrderItem[]"

由Service Reference的自动生成代码生成的结果XML然后是正确的。