Мыло не переводит поля ответа в типизированные объекты

Я новичок в SOAP, которому поручено воскресить старый мыльный интерфейс. Я перенес сервис мыла на новый кот по новому пути (и оставил клиент без изменений). Я отправляю запрос: http://myserver:8181/soap/SoapTest?wsdl и получаю ответ:

  <wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
    xmlns:ns3="http://schemas.xmlsoap.org/wsdl/soap/http"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://www.mycompany.com/SoapTest"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    name="SoapTestService" 
    targetNamespace="http://www.mycompany.com/SoapTest">

    <wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com"></wsdl:import>
    <wsdl:binding name="SoapTestServiceSoapBinding" type="ns1:SoapTest">...</wsdl:binding>
    <wsdl:service name="SoapTestService">...</wsdl:service>
  </wsdl:definitions>

Кажется многообещающим. Запрос к месту импорта SoapTest?wsdl=SoapTest.wsdl возвращает:

<wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
  xmlns:ns2="http://jaxb.dev.java.net/array" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  name="SoapTest"
  targetNamespace="http://webservices.mycompany.com">
  <wsdl:types>
    <xs:schema xmlns:tns="http://webservices.mycompany.com"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://webservices.mycompany.com" version="1.0">
    <xs:complexType name="sessionObj">
      <xs:sequence>
        <xs:element name="code" type="xs:int"/>
        <xs:element name="id" type="xs:long"/>
        <xs:element minOccurs="0" name="role" type="xs:string"/>
        <xs:element minOccurs="0" name="username" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    ... (and so on)

Таким образом, клиент может получать ассоциации имя члена xs: тип, но, похоже, не использует их или не применяет их. То есть ...

ХА... при просмотре я вижу, что xs используется в качестве пространства имен, но определено xmlns:xsd?? Как это может произойти?

Клиентские запросы ZSI (из Windows, если это имеет значение) к этому интерфейсу (Linux) получают ответы, содержащие ожидаемую полезную нагрузку данных, но затем сопоставляют каждый элемент данных с отдельным «свойством», что приводит к списку общих свойств.

Я ожидал список типизированных членов, где каждое свойство приводится к своему типу xs (например, int, long, string, string для приведенного выше), верно?

Заранее спасибо за любые подсказки.


person DJC    schedule 11.04.2012    source источник
comment
Учитывая объем информации, представленной здесь, я был бы удивлен, что вы получите достаточно внимания :)... Использование xs и xsd для псевдонима пространства имен не имеет значения: кажется, что пространства имен используются правильно, во всяком случае, префикс xsd кажется лишним в данном фрагменте. Я бы предложил обновить ваш вопрос с дополнительной информацией; может быть, фрагмент XML, описание того, как это преобразуется в отдельное свойство, и что на самом деле будет списком типизированных членов - в основном какой-то код. Было бы полезно больше WSDL ... почему-то я подозреваю, что ваша привязка SOAP здесь RPC ...   -  person Petru Gardea    schedule 14.04.2012


Ответы (2)


Из документации ZSI:

Если вызванная операция возвращает тип ComplexType, необходимо предоставить информацию о коде типа, чтобы сообщить ZSI, как десериализовать ответ.

Чтобы ZSI могла прозрачно десериализовать возвращенный сложный тип в экземпляр Person, модуль, определяющий класс и его код типа, должен быть добавлен в список ZSI.Path. Также можно явно указать ZSI, какой класс и код типа использовать, передав класс в качестве параметра методу Binding.Receive(). Первый метод часто предпочтительнее, особенно для общедоступных библиотек.

Генерация кода из WSDL и схемы XML — это второй способ, который ZSI предоставляет для доступа к службам WSDL. Учитывая путь к службе WSDL, создаются два файла: файл «службы» и файл «типов», которые затем можно использовать для доступа к службе.

person jlvaquero    schedule 19.04.2012
comment
пользователь, у меня еще не было возможности проверить это в коде, но ваш комментарий, кажется, вселяет надежду ... спасибо! - person DJC; 21.04.2012
comment
Это лучший способ почти для каждой среды SOAP. Используйте WSDL для создания строго типизированных классов и создайте платформу для преобразования XML-ответа в эти классы. - person jlvaquero; 23.04.2012

Учитывая, что вы не предоставили достаточно информации по реальной проблеме, я буду основывать это на том, что вы были новичком, и поэтому оберну свой ответ вокруг частей, которые я считаю относящимися к вашему вопросу.

Ваш основной веб-сервис описан в WSDL http://myserver:8181/soap/SoapTest?wsdl, который содержит импорт в родительский WSDL. Этот родительский WSDL содержит определения службы, которые могут быть связаны вашей основной службой.

Кажется многообещающим. Запрос к месту импорта SoapTest?wsdl=SoapTest.wsdl возвращает: ..

Из приведенного выше определения документа импорт:

<wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com">
</wsdl:import>

вставляет родительский файл WSDL, в котором содержится определение схемы для всех элементов и атрибутов, относящихся к вашей службе. Это означает, что автономный вызов покажет определение пространства имен xs. Подробнее о схемах и типах данных см. здесь.

ХА... при просмотре я вижу, что xs используется как пространство имен, но xmlns:xsd определен?? Как это может произойти?

Да, схема определяется не как отдельный файл, а как часть WSDL. Он определяется между <wsdl:types> тегами:

 <wsdl:types>
       <xs:schema xmlns:tns="http://webservices.mycompany.com" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://webservices.mycompany.com" version="1.0">
   [..]
 </wsdl:types>

См. также здесь дополнительную информацию о привязке ZSI и создании заглушек.

person Bitmap    schedule 20.04.2012
comment
Битмап, спасибо за разъяснения. Я еще посмотрю документы ZSI; мне кажется, что это связующие части, которые не работают. - person DJC; 21.04.2012