我正在使用SoapServer類在PHP中構建Web服務,但我遇到了一個複雜類型轉換的問題。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中的命名空間。但是.Net SOAP客戶端似乎並不瞭解在那裏定義了command
元素。但是,它確實知道這就是定義ArrayOfCommand
的地方。
所以我的問題是多:
- 這是一個已知的bug與SoapServer的?
- 如果沒有,我是否在我的WSDL中丟失了某些令人悲傷的東西?
- 我是不是正確編碼我的對象?
- 這是.Net的問題嗎?如果是這樣,那麼解決方法是什麼?