【问题标题】:SOAP-ERROR Client: Parsing WSDL with authentication errorSOAP-ERROR 客户端:使用身份验证错误解析 WSDL
【发布时间】:2012-11-02 11:30:42
【问题描述】:

我尝试编写我的 PHP Client Soap,它使用 ASP.Net Web 服务,并通过身份验证进行保护。 我的php代码是:

<?php
ini_set("soap.wsdl_cache_enabled", "0");  
try {
    $client = new SoapClient("https://www.webservicexxx.com:60443/service.asmx?WSDL", array('location' => 'https://webservicexxxcom:60443/service.asmx',
          'login' => "myLogin", 'password' => "myPAssword")); 
} catch (SoapFault $e) {
    echo $e;
}?>

我收到此错误消息:

 SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://www.webservicexxx.com:60443/service.asmx?WSDL' : failed to load external entity "https://www.webservicexx.com:60443/service.asmx?WSDL" in /var/www/webservice2/soap-client.php:5 Stack trace: #0 /var/www/webservice2/soap-client.php(5): SoapClient->SoapClient('https://www.web...', Array) #1 {main}

知道我在 ubuntu 服务器上的 php.ini 上设置了启用此扩展:

extension = php_openssl.dll
extension = php_soap.dll
extension = php_curl.dll

当我尝试使用身份验证在同一台服务器上解析另一个 php web 服务时,它可以工作:

try { 
    $client = new SoapClient("https://xx.xx.xx.xx:443/webservice1/notificationManager.wsdl", array('location' => 'http://xx.xx.xx.xx./webservice1/soap-server.php',
          'login' => "myLogin", 'password' => "myPass")); 
} catch (SoapFault $exception) { 
    echo $exception;       
} 

为什么我无法从第一个网络服务获得响应?

【问题讨论】:

  • 只需将 url 复制并粘贴到浏览器中的 wsdl 即可查看是否看到 wsdl。通过这样做,您可以确定不是连接问题。
  • wsdl 文件https://www.webservicexx.com:60443/service.asmx?WSDL 可以通过网络浏览器访问,并且需要认证。

标签: php ssl wsdl basic-authentication soap-client


【解决方案1】:

我使用nusoap 解决了这个问题。

$params = array(
  "param" => "value"
);

$soap_client = new nusoap_client($wsdl_url, true);
$soap_client->setCredentials(USER_SERVICE, PASS_SERVICE, 'basic');
$soap_client->soap_defencoding = 'UTF-8'; //Fix encode erro, if you need
$soap_return = $soap_client->call("method_name", $params);

【讨论】:

    【解决方案2】:

    为什么我无法从第一个网络服务获得响应?

    因为加载外部实体失败

    https://www.webservicexx.com:60443/service.asmx?WSDL
    

    确保 WSDL 可通过 PHP 的 SoapClient 访问和访问,您应该不会再遇到问题了。

    编辑: 根据您的 cmets,WSDL URL 需要 HTTP 身份验证。 PHP 的SoapClient 确实只支持soap 端点的这种身份验证,但 支持WSDL http 请求。这就是您看到失败的错误的原因。这与:

    解决方案是请求您自己的 WSDL 文件并将 SoapClient 指向它的副本。有关详细信息,请参阅链接的问题。

    【讨论】:

    • Web 服务https://www.webservicexx.com:60443/service.asmx?WSDL 可以通过任何导航器访问,它需要登录名和密码才能访问 wsdl 文件。我不知道我是否必须配置我的服务器,或者联系网络服务的供应商??
    • 使用导航器我猜你的意思是你的互联网浏览器,对吧?如果它需要用户名和密码,这意味着它使用 HTTP 身份验证 (Basic Auth)。请参阅WSDL to PHP with Basic Auth,这可能是您现在遇到的下一个问题。
    • 在使用基本身份验证方法时,我仍然收到错误“无法加载外部实体”,我之前尝试过。你认为我必须在 ubuntu 服务器上配置一些东西吗?或者我必须联系网络服务的供应商?
    • 我尝试使用以下方法解决我的问题:http://fr2.php.net/manual/en/soapclient.soapclient.php#101503https://bugs.php.net/bug.php?id=27777!我还是有同样的问题
    • 问题不在于网络服务的供应商。问题是 PHP 的 SoapClient 无法通过基本身份验证加载 WSDL。只有先将 WSDL 保存到磁盘,然后通过 SoapClient 能够加载的 WSDL URI 提供它,才能解决问题。用户评论 101503 显示了如何做到这一点。我可以想象还有其他方法可以做到这一点,但它们与已经概述的类似,所以我不知道您缺少哪些信息。