Soap: php сервер, C# клиент. Обмен массивами

Узнай цену своей работы

Формулировка задачи:

Основной проект написан на php. пот ТЗ необходимо написать веб-сервис, использующий soap. сервер был написан, xsd - валидация, передача простых данных, все это было организовано. для тестирования выбирался самописный C# клиент и программа SoapUI. первоначально возникла проблема с передачей массивов данных. C# клиент категорически не понимал данные, которые в схеме были описаны вот так:
Листинг программы
  1. <xsd:element name="buy_category" type="tns:Category" nillable="true"/>
  2. <xsd:complexType name="Category">
  3. <xsd:all>
  4. <xsd:element name="int_array" type="xsd:int" minOccurs="1" maxOccurs="unbounded"/>
  5. </xsd:all>
  6. </xsd:complexType>
ошибка вылетала следующая (приблизительный текст):
Невозможно десериализовать ответного сообщение. Невозможно преобразовать SomeType в SomeType[]
проблему решил заменив на массив:
Листинг программы
  1. <xsd:element name="buy_category" type="CategoryList" nillable="true"/>
  2. <xsd:complexType name="CategoryList">
  3. <xsd:complexContent>
  4. <xsd:restriction base="soapenc:Array">
  5. <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="Category[]"/>
  6. </xsd:restriction>
  7. </xsd:complexContent>
  8. </xsd:complexType>
  9. <xsd:complexType name="Category">
  10. <xsd:all>
  11. <xsd:element name="int_array" type="xsd:int"/>
  12. </xsd:all>
  13. </xsd:complexType>
но тут неожиданно проблема возникла в обратном - отправка массива от C# клиента к серверу. Типы были объявлены аналогично. Сервер категорически отказывался принимать данные, выкидывая сообщения:
SOAP-ERROR: Encoding: Violation of encoding rules
причем это сообщение выкидывал что soapUI, что клиент сделал обратный финт:
Листинг программы
  1. <xsd:element name="int_array" type="xsd:int" minOccurs="1" maxOccurs="unbounded"/>
soapUI активно скушал эту схему и отправил запрос вида и получил вполне вменяемый ответ
Листинг программы
  1. <int_array xsi:type="xsd:string" xs:type="type:string">1</int_array>
  2. <int_array xsi:type="xsd:string" xs:type="type:string">2</int_array>
  3. <int_array xsi:type="xsd:string" xs:type="type:string">3</int_array>
  4. <int_array xsi:type="xsd:string" xs:type="type:string">4</int_array>
C# клиент сформировал ответ и сервер получил запрос вида (фрагмент):
Листинг программы
  1. <int_array href="#id2"/>
  2. <q3:Array id="id2" q3:arrayType="xsd:string[3]" xmlns:q3="http://schemas.xmlsoap.org/soap/encoding/">
  3. <Item>1</Item>
  4. <Item>asder</Item>
  5. <Item>book</Item>
  6. </q3:Array>
и ответ от сервера:
SOAP-ERROR: Encoding: Violation of encoding rules
теперь вопрос, что я делаю не так? или же как настроить C# клиент чтобы он отправлял не массив итемов, а повторяющиеся теги?

Решение задачи: «Soap: php сервер, C# клиент. Обмен массивами»

textual
Листинг программы
  1. [XmlArray("item")]
  2.     [XmlArrayItem(typeof(item), ElementName = "item")]
  3.     public item[] items { get; set; }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы