.NET SOAP сериализует неограниченную последовательность - PullRequest
1 голос
/ 01 декабря 2011

У нас есть 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">, а не неограниченную последовательность, но, учитывая вышеизложенное, единственный способ использоватькакая-то пользовательская сериализация?

EDIT : Пример WSDL в https://gist.github.com/1422704

1 Ответ

1 голос
/ 15 февраля 2012

Похоже, что службы .NET WCF не очень хорошо работают с нашим WSDL (который был создан вручную с упором на XSD, а не на SOAP).

Самый простой способ заставить SOAP API работать с .NET - это изменить WSDL на использование типа массива SOAP, поэтому <items> становится soap-enc:Array с soap-enc:arrayType="tns:OrderItem[]".

Полученный XML-код, сгенерированный автоматически сгенерированным кодом Service Reference, будет правильным.

...