【问题标题】:Fatal error: Uncaught SoapFault exception: [WSDL]致命错误:未捕获的 SoapFault 异常:[WSDL]
【发布时间】:2011-02-05 12:43:18
【问题描述】:

我在调用从 PHP 设置的 Web 服务时遇到问题。下面错误消息中的混淆地址http://XXX.XXX.XXX.XXX/test.asmx?wsdl 返回一个有效的WSDL。我已成功尝试使用 VB.net 客户端将其作为 Web 服务调用,但是当我在 Debian 上从 PHP 调用它时,我收到以下消息:

致命错误:未捕获的 SoapFault 异常:[WSDL] SOAP-ERROR:解析 WSDL: 无法从“http://XXX.XXX.XXX.XXX/test.asmx?wsdl”加载 在 /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php:101 堆栈跟踪: #0 /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php(101): SoapClient->SoapClient('http://XXX.XXX.XXX.XXX/', Array) #1 {main} 抛出 在 /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php 在线 101

可能是什么问题?我在下面包含了 Web 服务和 PHP 客户端的代码。

网络服务:

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
...
' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
' <System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class WebService1
Inherits System.Web.Services.WebService 
    <WebMethod()> _
    Public Function HelloWorld() As String
        Return "Hello World"
    End Function
End Class

PHP 客户端:

require_once($_SERVER['DOCUMENT_ROOT']."/catalog/fomeus/includes/soap/nusoap.php");

$objClient = new soapclient("http://XXX.XXX.XXX.XXX/test.asmx?wsdl",
    array('trace' => 1, 'exception' => 0, 'cache_wsdl' => 0));

print_r($objClient -> HelloWorld());

如果有帮助的话,我正在使用 PHP 5.2.6 版。我一直在浏览不同论坛的大量帖子,试图找出问题所在。很多人都遇到过同样的问题,但到目前为止我找到的解决方案都没有对我有用。任何帮助将不胜感激。

【问题讨论】:

  • 我不知道这可能是什么,但是,您有没有可能尝试 nuSOAP?
  • 尝试在您创建 SoapClient 对象的行周围包裹一个 try..catch 块。不要忘记 catch 应该是针对 SoapFault 的一种类型 - 即 catch (SoapFault $e){} 而不是 catch (Exception $e) {} 在 catch 内,查询异常字段(getMessage 等)或 var_dump 异常,然后发布它告诉你的内容。
  • 哪里写的是“例外”,不应该是“例外”吗?

标签: php web-services soap


【解决方案1】:

另一个值得关注的选项是 cURL。您可以将有效负载创建为 XML 字符串,并使用 cURL 将其发送到相同的 URL。然后,您需要捕获响应代码并酌情处理。当我遇到 SOAPClient 问题时,我转向 cURL - 就像一个魅力。

【讨论】:

  • Permhiwa : 你能分享一些这方面的示例代码吗?
【解决方案2】:

如果您使用的是 nusoap(php 5.2 有一个本机 soapclient,我更喜欢它),我首先看到的是您的论点。如果您使用的是 WSDL,而不是数组,则 nusoap 的 soapclient 构造函数的参数 #2 在这里应该是布尔值 TRUE。试试:

$objClient = new soapclient("http://XXX.XXX.XXX.XXX/test.asmx?wsdl",true);
print_r($objClient->HellowWorld());

这就是我过去使用 wsdl 的方式。

如果您使用的是本机客户端,并且遇到 wsdl 问题,您可以随时绕过它并直接调用,如下所示:

$objClient = new soapclient(null,array('uri'=>'http://xxx/test.asmx','location'=>'http://xxx/test.asm'));
$objClient->__call('HelloWorld',array());

应该可以,但不像 wsdl 那样容易导航。

【讨论】:

  • 不确定原始海报,但我使用的是 natie php soap 客户端
  • 我使用原生 php soapclient 取得的最大成功就是通过这种方式完成的: $objClient = new soapclient(null,array('uri'=>'xxx/test.asmx','location'=>'http://xxx/…));然后通过 $objClient->__call('HelloWorld',array()); 调用你的方法;
  • 我最终做的是使用 file_get_contents 请求 wsdl 文件,将其缓存在本地,然后将其与 SoapClient 一起使用。这样我就可以检查它是否是有效的 XML 并绕过问题(有点难看,但它有效)
【解决方案3】:

尝试在您的 php.ini 中打开 php_soap.dll 和 php_openssl.dll。 位于 apache 文件夹 \apache\apache2.4.2\bin

去掉“;”

【讨论】:

    【解决方案4】:

    添加 index.php 对我在 php 应用程序上工作很有帮助

    $client = new SoapClient('http://www.domain.com/api/v2_soap/?wsdl'=1)
    
    $client = new SoapClient('http://www.domain.com/index.php/api/v2_soap/?wsdl'=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2018-12-24
      • 2012-12-19
      • 1970-01-01
      • 2015-05-23
      • 2012-02-18
      相关资源
      最近更新 更多