【问题标题】:accessing soap on iis from apache / php从apache / php访问iis上的soap
【发布时间】:2013-01-17 08:48:11
【问题描述】:

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

致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR: Parsing 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 服务器的问题?

【问题讨论】:

  • 可以直接下载wsdl文件吗? (例如通过使用 curl?)
  • 是的,但是当我从本地文件加载 wsdl 时,当我使用服务的功能时出现另一个错误:致命错误:未捕获的 SoapFault 异常:[HTTP] 无法连接到主机...
  • 您是直接下载的,还是在 PHP 中下载的?您确定 Apache 有权下载托管在 8080 端口上的页面吗?
  • 我在浏览器中下载了源代码。当您输入 url 时,您将获得 wsdl。我将它作为 wsdl 文件保存在网络服务器上,我可以从脚本中加载它。
  • 然后首先确保您可以在 Apache 中的 PHP 中执行相同的操作。

标签: php apache soap windows-server-2008


【解决方案1】:

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

  • 是否有任何防火墙、反恶意软件程序等可能会阻止 Apache 服务器的 8080(传出,而非传入)端口?
  • 是否有连接到服务器所需的任何 SSL 证书或密码(或两者)。如果是,您应该告诉 PHP 设置适当的标头。
  • 您可能希望将默认 SoapClient 替换为直接使用 curl 的内容。在那里你可以设置一些 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 调用,并且可能会真正找出它失败的原因。

您可以像使用任何SoapClient 一样使用上述类,例如:

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

【讨论】:

  • 检查 1:我问过,但还没有答案。检查 2:不需要我认为,我的 ISS 没有任何东西工作。检查 3:SoapCurlWrapper 给出相同的致命错误...
  • 正如我所说,WSDL 下载部分将不起作用,因为包装器不会用于此目的。但对于实际的 SOAP 通信,将使用包装器,您可以在其中添加其他调试命令来帮助找出错误所在。
  • 不错!新错误:致命错误:未捕获的 SoapFault 异常:[CURL 错误:错误:14094410:SSL 例程:SSL3_READ_BYTES:sslv3 警报握手失败] 35 我们更进一步。有什么建议么?谢谢!
  • SSL 握手错误。尝试将 SSL 版本更改为 2,或完全删除该行。还可以尝试阅读您收到的新错误,例如:serverfault.com/questions/229972/… 您似乎需要客户端证书才能连接,因此您应该再次检查第 2 点。
  • 好的!我已经设置 curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($handle, CURLOPT_SSLVERSION, 1);一切都运行良好!非常感谢 SoapCurlWrapper 让我走上正轨!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多