我们有一个包含以下类型定义的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>
...
使用XmlArray
和XmlArrayItem
属性,我们可以分别控制<OrderItem>
和<item>
元素的名称,但无法达到所需的结构:
...
<items>
<item>foo</item>
<item>bar</item>
</items>
...
我知道如果WSDL指定类似<xsd:restriction base="soap-enc:Array">
而不是无限制序列的话,可以避免这个问题,但鉴于上述是使用某些自定义序列化的唯一方法吗?
答案 0 :(得分:1)
似乎.NET WCF服务与我们的WSDL不一致(它是手动创建的,重点是XSD而不是SOAP)。
使SOAP API与.NET一起使用的最简单方法是更改WSDL以使用SOAP数组类型,因此<items>
变为soap-enc:Array
soap-enc:arrayType="tns:OrderItem[]"
。
由Service Reference的自动生成代码生成的结果XML然后是正确的。