.NET SOAP Сериализация неограниченной последовательности

У нас есть 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


person cmbuckley    schedule 01.12.2011    source источник
comment
Вы также можете опубликовать определение элемента, на который ссылается тип вывода сообщения?   -  person np-hard    schedule 01.12.2011
comment
Верно ли, что вы не можете изменить веб-службу и wsdl и пытаетесь сформировать XML-запрос, манипулируя атрибутами XML-сериализации классов на стороне клиента?   -  person Pavel Gatilov    schedule 01.12.2011
comment
Да, WSDL предоставляется, и в идеале мы хотели бы использовать сгенерированные классы Service Reference с некоторой пользовательской сериализацией для получения требуемого вывода.   -  person cmbuckley    schedule 02.12.2011


Ответы (1)


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

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

Результирующий XML-код, сгенерированный автоматически созданным кодом ссылки на службу, является правильным.

person cmbuckley    schedule 15.02.2012
comment
@cubuckley Я застрял в аналогичной проблеме, работая с прокси-серверами, созданными .Net. Я понял вашу идею, но почему-то я не могу преобразовать свой атрибут элемента в sequence в soap-enc:Array. Не могли бы вы поделиться примером вашего окончательного wsdl, соответствующего wsdl в исходном вопросе. Заранее спасибо. - person Ali Arslan; 08.06.2015
comment
Привет @brain.overflow, сегодня я попытаюсь откопать рабочий WSDL и добавить его в ответ. - person cmbuckley; 08.06.2015
comment
@brain.overflow Я не могу быть на 100% уверен, что это правильно, поскольку у меня больше нет доступа к исходному приложению, но у меня есть обновил суть, добавив исправление для complexType, а также новый WSDL. - person cmbuckley; 09.06.2015