2

我尝试编写我的 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;       
} 

为什么我不能从第一个 web 服务得到响应?

4

2 回答 2

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);
于 2015-02-02T19:39:08.110 回答
0

为什么我不能从第一个 web 服务得到响应?

因为它未能加载外部实体

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

确保 WSDL 可被 PHP 访问和访问,SoapClient并且您应该不再有问题。

编辑:根据您的评论,WSDL URL 需要 HTTP 身份验证。PHP只支持使用soap 端点而不是WSDL http 请求的SoapClient这种身份验证。这就是为什么您会看到它失败的错误。这与:

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

于 2012-11-02T13:08:42.047 回答