致命错误:未捕获的SoapFault异常:[WSDL]

时间:2011-02-05 12:43:18

标签: php web-services soap

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

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL:
  Couldn't load from 'http://XXX.XXX.XXX.XXX/test.asmx?wsdl'
  in /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php:101

Stack trace:
  #0 /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php(101):
    SoapClient->SoapClient('http://XXX.XXX.XXX.XXX/', Array) #1 {main} thrown
    in /var/www/domain/mywebsite.com/public_html/catalog/fomeus/orders.php
    on line 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,如果有任何帮助的话。我一直在不同论坛上发布大量帖子,试图找出问题所在。很多人都有同样的问题,但到目前为止我找到的解决方案都没有为我工作。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

另一个选择是cURL。您可以将有效负载创建为XML字符串,并使用cURL将其发送到同一URL。然后,您需要根据需要捕获响应代码和进程。当我遇到SOAPClient问题时,我转移到了cURL - 就像一个魅力。

答案 1 :(得分:0)

如果你正在使用nusoap(php 5.2有一个我喜欢的本地soapclient),我看到的第一件事就是你的论点。如果你使用的是WSDL而不是数组,那么nusoap的soapclient构造函数的参数#2应该是boolean 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那样容易导航。

答案 2 :(得分:0)

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

删除“;”

答案 3 :(得分:0)

添加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)