SOAP-ERROR客户端:解析具有身份验证错误的WSDL

时间:2012-11-02 11:30:42

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

我尝试编写我的PHP客户端Soap,它使用ASP.Net webservice,通过身份验证进行保护。 我的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 webservice时,它可以工作:

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;       
} 

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

  

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

因为无法加载外部实体

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

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

编辑:根据您的评论,WSDL URL需要HTTP身份验证。 PHP SoapClient仅支持使用soap端点进行此类身份验证,但支持WSDL http请求。这就是您看到失败的错误的原因。这与:

有关

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