1

我们有一个 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

4

1 回答 1

1

似乎 .NET WCF 服务与我们的 WSDL(它是手动创建的,重点是 XSD 而不是 SOAP)不能很好地配合。

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

由服务参考的自动生成代码生成的 XML 是正确的。

于 2012-02-15T00:52:39.273 回答