我正在使用SoapServer类在PHP中构建Web服务,但是我遇到了一个复杂类型转换的问题。
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中的命名空间。但是,.Net SOAP客户端似乎并不理解command
元素是在那里定义的。但是,它确实理解这是定义ArrayOfCommand
的地方。
所以我的问题是多部分:
答案 0 :(得分:1)
通过使用the Google WSDL作为参考,再次处理我的WSDL的<types/>
部分,我能够解决此问题。然后,我必须在我的PHP函数中运用一些魔法,将$command
的元素转换为适合于WSDL中各自类型的元素,并将整个命令编码为ns2:command
。当与WSDL保持一致时,这一切都很好地融合在一起,而.Net对它没有任何困难。
我很惊讶开发社区中的任何人都不愿意回答这个问题,但我希望有人能够从中收集至少一些方向来解决他们自己的问题。