2011-11-11 73 views
1

我在我的生產服務器(遠程服務器)上在PHP上實現的Soap服務器出現問題。PHP SoapServer:無法解析XML(WSDL文件) - 無XML文件 - 在URL上使用「?wsdl」

我已經實現了一個簡單的SOAP服務器(原生PHP類),只是在WSDL模式下的函數。

所以我的代碼如下所示:

ini_set("soap.wsdl_cache_enabled", "0"); 

$server = new SoapServer("wsSeguimiento.wsdl"); 

$server->addFunction("ResultadoDetalleExtendido"); 

$server->handle(); 

現在,你知道,當你調用通過Web瀏覽器的服務器如URL的「http://localhost/soapserver/wsServer.php」你有一個空白頁 - 在我的情況下 - 或者你編程的任何東西(服務器代碼)。

但是,如果你在最後的「http://localhost/soapserver/wsServer.php?wsdl」中調用了與「?wsdl」相同的URL,那麼服務器(我猜想的句柄函數)會解析XML wsdl on Web瀏覽器,所以你得到一個text/xml內容類型,你可以看到XML定義本身。

現在,它適用於我的開發環境。沒問題。 我已經創建了一個Soap客戶端來測試我自己的服務器,並查看它是否會返回已耗盡的響應,並且一切正常。 但是,當我將代碼上傳到生產服務器時,它不起作用。

Firefox在「?wsdl」調用中顯示URL,典型的錯誤是「XML malformed」,但在這種特殊情況下,它從一開始就像是根本沒有XML文件。 如果我用我的客戶,我得到的錯誤:

SOAP的錯誤:解析WSDL:「?://.../SOAP_SERVER/seguimientoServer.php WSDL HTTP」:無法從加載開始標記預計'<'找不到

我已經正確更改了WSDL XML文件中的名稱空間和URL。所以它必須正常工作。但事實並非如此。

我發現有與HTTP頭本身有關的現有缺陷,基於分塊數據,內容長度,X-通電通過,無論...

但我沒有看到一個解決方案。

我已經做了在此基礎上我的服務器上的一個小黑客(手柄()調用之後):

if(isset($_REQUEST['wsdl'])) 
{ 
    ob_clean(); 
    echo file_get_contents("wsSeguimiento.wsdl"); 
} 

而與此,它真的有效!但我敢肯定,這並不一定是解決問題的方法...

回答

0

貌似在您的WSDL的開頭無效字符。也許是一個空間?

+0

不......不是。它對我的Apache環境開發非常有用。但它不適用於生產Apache,並且我在XML的開始階段沒有改變...... :( – Lightworker