Search code examples
c#wcfxml-serializationwsdlservice-reference

.NET SOAP Serializing Unbounded Sequence


We have a WSDL which contains the following type definition:

...
<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>
...

When adding the service as a Service Reference in VS 2010, the OrderItems class contains an item property which is of type OrderItem[]. The SOAP request is then generated as follows:

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

Using the XmlArray and XmlArrayItem attributes we can control the names of the <OrderItem> and <item> elements respectively, but can't get to the desired structure:

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

I'm aware that this problem could be avoided if the WSDL specified something like <xsd:restriction base="soap-enc:Array"> rather than an unbounded sequence, but given the above is the only way forward to use some custom serialization?

EDIT: Example WSDL at https://gist.github.com/1422704


Solution

  • It seems that .NET WCF services do not play nice with our WSDL (which was manually created with a focus on the XSD and not on SOAP).

    The easiest way to get the SOAP API to work with .NET was to alter the WSDL to use the SOAP array type, so <items> becomes a soap-enc:Array with soap-enc:arrayType="tns:OrderItem[]".

    The resulting XML generated by the Service Reference's auto-generated code is then correct.