Я работаю над созданием веб-службы на PHP с использованием класса SoapServer, но у меня возникла проблема с приведением сложных типов.
WSDL полностью действителен, и PHP SoapClient обрабатывает его безупречно, но, похоже, проблема в том, что сложные типы, которые возвращаются, не приводятся должным образом. Это обнаружилось при использовании службы в .Net, так как я получал исключения, которые указывали, что тип не присутствует в данном пространстве имен.
Я несколько раз искажал свою функцию, меняя пространство имен элемента, но .Net продолжает выдавать мне ошибки, независимо от того, какое пространство имен я использую.
Рассмотрим следующую аббревиатуру сценария:
function getCommands() {
$output = array();
// ...
foreach($result as $row) {
$output[] = new SoapVar($row, SOAP_ENC_OBJECT, 'ns1:command');
}
return $output;
}
Сокращенный ответ:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="urn:MyWebService"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getCommandsResponse>
<return SOAP-ENC:arrayType="ns1:command[12]" xsi:type="ns1:ArrayOfCommand">
<item xsi:type="ns1:command">
<!-- ... -->
</item>
<!-- ... -->
</return>
</ns1:getCommandsResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Что я заметил, так это то, что xmlns:ns1
определяется с помощью WSDL и соответствует пространству имен в WSDL. Однако SOAP-клиент .Net, похоже, не понимает, что здесь определен элемент command
. Однако он понимает, что именно здесь определяется ArrayOfCommand
.
Итак, мой вопрос состоит из нескольких частей:
- Это известная ошибка с SoapServer?
- Если нет, я что-то упустил в своем WSDL?
- Не правильно ли я кодирую свои объекты?
- Это проблема с .Net? Если да, то какой обходной путь?