Клиенту .NET 2.0 не удается десериализовать действительный XML-код веб-службы Apache-SOAP, для всех свойств отображается null

Коллега создал веб-службу Java, работающую в среде выполнения Apache-SOAP на сервере Tomcat 6, но протестировал ее только с помощью встроенного инструмента Eclipse и SoapUI. Вывод этой службы представляет собой массив объектов, каждый из которых состоит из пяти строковых полей. Мне нужно написать клиент .NET для использования этой службы, и я использовал Visual Studio 2005 для импорта WSDL в качестве веб-ссылки. Метод выполняется успешно, и массив заполняется правильным количеством объектов, но поля каждого объекта отображаются как пустые.

Я использовал Fiddler для проверки правильности XML, возвращаемого клиенту, но клиентский класс .NET, похоже, не может его десериализовать. Есть предположения?

Дополнительные данные:
– WSDL определяется как документ/литерал
– Возвращаемый XML не содержит разделов «multiref», для которых я видел рекомендации по написанию пользовательского атрибута soap
– Возвращаемый XML кажется чтобы определить новое, но идентичное пространство имен для каждого объекта в возврате. Может ли клиент просто не понимать разные имена пространств имен, даже если все они разрешаются в один и тот же тип (указанный в WSDL)? - Похоже, что XML-код запроса указывает UTF-16 вместо UTF-8. Само по себе изменение этого параметра не помогает.
 – Использование стороннего инструмента (.NET WebService Studio) возвращает допустимый ответ для других методов службы, но исключение "System.Xml.XmlException: Data at the root уровень недействителен. Строка 1, позиция 1." для метода, над которым я работаю. Это отдельная проблема? (Я читал, что это может быть вызвано Transport-Encoding: chunked)

Я надеюсь, что это что-то простое, так что мне не придется очищать (длинный) WSDL от компрометирующих улик, прежде чем публиковать его здесь. А пока вот XML запроса и ответа.

Запрос:


<?xml version="1.0" encoding="utf-16"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Body>
        <getPrinterList xmlns="http://service.project.team.dept.company.com" />
      </soap:Body>
    </soap:Envelope>
Ответ:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <getPrinterListResponse xmlns="http://tempuri.org/com.company.team.dept.project.service.projectService">
         <ns1:getPrinterListReturn xmlns:ns1="http://service.project.dept.team.company.com">
            <ns1:printerType>type1</ns1:printerType>
            <ns1:queueName>queue1</ns1:queueName>
            <ns1:description>desc1</ns1:description>
            <ns1:hostName>host1</ns1:hostName>
            <ns1:hostPort>port1</ns1:hostPort>
         </ns1:getPrinterListReturn>
         <ns2:getPrinterListReturn xmlns:ns2="http://service.project.dept.team.company.com">
            <ns2:printerType>type2</ns2:printerType>
            <ns2:queueName>queue2</ns2:queueName>
            <ns2:description>desc2</ns2:description>
            <ns2:hostName>host2</ns2:hostName>
            <ns2:hostPort>port2</ns2:hostPort>
         </ns2:getPrinterListReturn>
         <ns3:getPrinterListReturn xmlns:ns3="http://service.project.dept.team.company.com">
            <ns3:printerType>type3</ns3:printerType>
            <ns3:queueName>queue3</ns3:queueName>
            <ns3:description>desc3</ns3:description>
            <ns3:hostName>host3</ns3:hostName>
            <ns3:hostPort>port3</ns3:hostPort>
         </ns3:getPrinterListReturn>
         <ns4:getPrinterListReturn xmlns:ns4="http://service.project.dept.team.company.com">
            <ns4:printerType>type4</ns4:printerType>
            <ns4:queueName>queue4</ns4:queueName>
            <ns4:description>desc4</ns4:description>
            <ns4:hostName>host4</ns4:hostName>
            <ns4:hostPort>port4</ns4:hostPort>
         </ns4:getPrinterListReturn>
         <ns5:getPrinterListReturn xmlns:ns5="http://service.project.dept.team.company.com">
            <ns5:printerType>type5</ns5:printerType>
            <ns5:queueName>queue5</ns5:queueName>
            <ns5:description>desc5</ns5:description>
            <ns5:hostName>host5</ns5:hostName>
            <ns5:hostPort>port5</ns5:hostPort>
         </ns5:getPrinterListReturn>
      </getPrinterListResponse>
   </soapenv:Body>
</soapenv:Envelope>

Опять же, ответ правильно переносится в приложение и преобразуется в массив правильного типа и длины, но каждый из текстовых элементов в них («тип1», «порт1» и т. д.) теряется. Мои искренние извинения, если анонимизация приведенного выше XML привела к ошибкам.


person RJ Cantrell    schedule 20.10.2009    source источник


Ответы (1)


Раньше я сталкивался со странностями при подключении клиента .Net к Apache Axis в Tomcat. Вы указали свою веб-ссылку на файл *.wsdl? Попробуйте указать веб-ссылку на определение wsdl, которое распечатывает Axis. Перейдите в /axis/index.jsp > List > выберите службу и нажмите WSDL. Используйте этот URL-адрес для своего объекта веб-ссылки

Это имело большое значение для сгенерированного кода веб-ссылки, а также решило проблемы кодирования (RPC по сравнению с литералом) и т. д. в данных XML.

person jqa    schedule 21.10.2009
comment
WSDL, который я импортировал как веб-ссылку, был получен при доступе к host/pathToService?wsdl -- это служба предоставляемый самой службой, отличается от приложения-менеджера? - person RJ Cantrell; 21.10.2009
comment
попробуйте изменить литерал на rpc, повторно разверните службу, а затем переопределите веб-ссылку, чтобы принять изменения. - person jqa; 22.10.2009