从apache / php访问iis上的soap

时间:2013-01-17 08:48:12

标签: php apache soap windows-server-2008

我必须在PHP中创建一个SoapClient,用于托管在Windows / IIS上的Web服务。 当我从本地IIS + PHP运行脚本时,它可以工作。 当我从Apache Web服务器的本地XAMP运行相同的脚本时,我总是得到同样的错误:

  

致命错误:未捕获的SoapFault异常:[WSDL] SOAP-ERROR:解析   WSDL:无法从'https://online.wings.eu:8080/wsdl/IWingsWeb'加载

<?php
$url = 'https://online.wings.eu:8080/wsdl/IWingsWeb';

$options["connection_timeout"] = 25;
$options["location"] = $url;
$options['trace'] = 1;

$client = new SoapClient($url,$options);
print_r($client->__getFunctions());
?>

在Apache上启用SOAP和openssl。 我还可以访问非Windows服务器上托管的其他服务。

这是我的Apache的问题还是托管SOAP服务器的Windows服务器的问题?

1 个答案:

答案 0 :(得分:0)

可能无法建立Apache与IIS服务器之间的连接。您应该检查以下内容:

  • 是否有任何防火墙,反恶意软件程序等可能会阻止Apache服务器上的8080(传出而非传入)端口?
  • 是否有连接到服务器所需的SSL证书或密码(或两者)。如果是,您应该告诉PHP设置适当的标题。
  • 您可能希望将默认SoapClient替换为直接使用curl的内容。在那里你可以设置几个卷曲参数,并检查是否有实际错误。

像这样:

class SoapCurlWrapper extends SoapClient {
  protected function callCurl($url, $data, $action) {
     $handle   = curl_init();
     curl_setopt($handle, CURLOPT_URL, $url);
     curl_setopt($handle, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml", 'SOAPAction: "' . $action . '"'));
     curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
     curl_setopt($handle, CURLOPT_SSLVERSION, 3);
     $response = curl_exec($handle);
     if (empty($response)) {
       throw new SoapFault('CURL error: '.curl_error($handle),curl_errno($handle));
     }
     curl_close($handle);
     return $response;
   }

   public function __doRequest($request,$location,$action,$version,$one_way = 0) {
       return $this->callCurl($location, $request, $action);
   }
 }

请注意,PHP的SOAP实现不会使用上面的包装器来下载WSDL文件(您必须手动执行),但是您可以将它用于实际的WS调用,并且可能实际上找出它失败的原因。 / p>

你可以像任何SoapClient一样使用上面提到的类,例如:

$oWS = new SoapCurlWrapper($location_of_wsdl_file,$parameters);