2011-05-14 101 views
2

我正在使用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的地方。

所以我的問題是多:

  1. 這是一個已知的bug與SoapServer的?
  2. 如果沒有,我是否在我的WSDL中丟失了某些令人悲傷的東西?
  3. 我是不是正確編碼我的對象?
  4. 這是.Net的問題嗎?如果是這樣,那麼解決方法是什麼?

回答

1

我能夠通過再次使用我的WSDL的<types/>部分解決此問題,使用the Google WSDL作爲參考。然後,我不得不在我的PHP函數中使用一些魔術,將適合其各自類型的$command的元素投射到WSDL中,並將整個命令編碼爲ns2:command。當與WSDL保持一致時,這一切都很好地融合在一起,並且.Net對它沒有任何困難。

我很驚訝在開發社區沒有人願意回答這個問題,但我希望有人能夠從中收集至少一些方面的信息,如何解決他們自己的這個問題。