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

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

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

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

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

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

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


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

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

6   голосов , оценка 4.167 из 5
Похожие ответы