2010-07-07 153 views
0

我試圖使用PHP和SOAP使用Web服務。 Web服務使用.NET構建,並託管在ASP服務器上。我正在使用以下代碼與API進行交互,但我一直在解析WSDL時遇到錯誤。 PHP UNIX服務器有一個SSL證書,Web服務主機也有一個SSL證書,我使用https來啓動事務。通過PHP消費的ASP服務器上的SOAP Web服務

這種特殊的API調用請求字符串一個會員號:

$wsdl=' https://domain.com/ws.asmx?wsdl ';

$client=new SOAPClient($wsdl, array('exceptions'=>0));

$result=$client->IsMemberCurrent('123456789');

錯誤:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'domain/ws.asmx?wsdl' : Start tag expected, '<' not found in index.php on line 4 

我可以看到WSDL內容,但我收到錯誤消息通過PHP表明它無法看到或無法處理WSDL文件?

SOAP 1.2 service description:POST /SubscriberAPI.asmx HTTP/1.1 
Host: subdomain.domain.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Body> 
    <IsMemberCurrent xmlns="http://www.domain.com/"> 
     <MembershipNo>string</MembershipNo> 
    </IsMemberCurrent> 
    </soap12:Body> 
</soap12:Envelope> 

回答

0

看來你不能訪問WSDL文件。所以你需要診斷問題。

嘗試

echo htmlentities(file_get_contents($wsdl));

它會給你更好的洞察力,以什麼PHP得到作爲響應。

一旦你的SoapClient工作,你的下一行代碼將無法按預期工作。

您需要將您的參數包裝在關聯數組中,否則Web服務將無法識別它。

此外,由.NET Web服務返回的響應將是一個IsMemberCurrentResponse對象,它包含一個IsMemberCurrentResult,因此您需要用以下代碼替換最後一行。

$params = array('MembershipNo'=>'1234567890'); 
$response = $client->IsMemberCurrent($params); 
$result = $response->IsMemberCurrentResult; 
+0

感謝您的提示。我按照建議完成了,但是我得到的回報是相同的 - 無法加載錯誤。這是否意味着防火牆問題,因爲當我嘗試直接從Web瀏覽器訪問WSDL文件時,我能夠看到WSDL文件? – chocolatecoco 2010-07-07 13:11:17

+0

如果它在file_get_contents上出現錯誤,那麼它是連接到IIS框的問題,而不是IIS或ASP.NET的問題。 這可能是一個防火牆問題 - 但需要更多的信息。 除了無法加載以外,還能獲得更多信息嗎? 您正在使用的Web瀏覽器位於UNIX服務器上嗎? 你可以嘗試通過HTTP而不是https? – 2010-07-07 13:19:58

+0

我的web服務器使用PHP/UNIX,我試過HTTP和HTTPS,但是我得到的錯誤是它無法解析WSDL文件。您在我的原始文章中看到的錯誤消息是PHP顯示的所有信息,除非有可用於提取更多信息的調試方法? – chocolatecoco 2010-07-07 13:23:15