Коллега создал веб-службу 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 привела к ошибкам.