2010-10-20 71 views
5

我是SOAP的新手,并且处理一个Web服务,它似乎之前没有人使用过PHP接口。除C#外,他们没有任何示例代码,但我的确拥有这些代码。 eServices.asmx提供了WSDL,如果这是正确的说法。调试PHP SOAP调用

我得到的错误是“服务器无法识别HTTP Header SOAPAction的值:”那个训练冒号表明没有值传递,也许。

我的代码如下所示:

$URL = "http://nolaflash.example.com/xxxWS/eServices.asmx"; 

$namespace="http://www.example.com/webservices/"; 

include("SOAP/Client.php"); 

$soapclient = new SOAP_Client($URL); 

$xml_data = // valid XML is here; 

$res = $soapclient->UpdateData('usrname','pass',$xml_data); 

,但我自己也尝试:

$param = array('usrname','pass',$xml_data); 
$res = $soapclient->call('UpdateData',$param, $namespace); 

谷歌搜索表明,这种错误是一个命名空间的问题。 C#代码我只有一个命名空间参考:

[System.Web.Services.WebServiceBindingAttribute(Name="eServicesSoap", Namespace="http://www.example.com/webservices/")] 

如果我倾倒$ SoapClient的,以之前的函数调用我看到,它已经从eServices.asmx接收数据的屏幕。

我不确定如何进行调试,而且服务人员不熟悉与.NET IDE之外的服务交互。

有什么想法?建议吗?

回答

8

我通常使用方法getFunctionsgetLastRequest 来帮助我解决问题。首先我看看函数列表和WSDL。有时WSDL和/或服务器没有正确设置/配置/编码。所以这个函数列表可能没用。 WSDL文件应该是权威的,但是,唉,蹩脚的编码器等...

所以有时我必须在黑暗中刺,看看错误,然后看最后的请求。有了这个,你可以看到生成的实际XML。将它与一些可用的XML示例进行比较。

在处理不想编写文档的编码人员时,这已证明最有用。顺便说一下,他们应该给出XML示例 - 不会显示如何使用语言XYZ生成XML。可能有更多有用的相关信息在the PHP/Soap documentation

HTH

+0

感谢您的答复模拟人生!当我打电话给 $ funcs = $ soapclient - > __ getFunctions(); print_r($ funcs); 我得到同样的错误? SOAP_Fault对象 ( [error_message_prefix] => [模式] => 1 [级] => 1024 [代码] =>皂:客户端 [消息] =>服务器不承认的值HTTP头部SOAPAction:。 [userinfo] => – jerrygarciuh 2010-10-20 15:14:17

+0

好的,那么问题就会更深入,更可能是一个配置问题......搜索提出了一些关于XML名称空间的问题:http://bluebones.net/2003/ 07/server-did-not-recognized-http-header-soapaction/ – 2010-10-21 02:35:59

+0

顺便说一句,你使用的是WSDL文件/ URL吗? – 2010-10-21 02:39:25

0

你可以使用Fiddler网络debuger调试目的。我发现它非常有用。 在这些日子里,我正在开发基于.net Web服务的项目,并且我必须通过PHP来使用它们。 这是一个工作(而且非常简单)的一段代码。希望这可以帮到你。 这段代码的目的是检查特定记录上的状态。

这是WSDL

POST /b1synccontext.asmx HTTP/1.1 
Host: 00.00.00.0 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://tempuri.org/QueueEntryGetStatus" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <QueueEntryGetStatus xmlns="http://tempuri.org/"> 
     <BuffID>int</BuffID> 
    </QueueEntryGetStatus> 
    </soap:Body> 
</soap:Envelope> 
HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <QueueEntryGetStatusResponse xmlns="http://tempuri.org/"> 
     <QueueEntryGetStatusResult>int</QueueEntryGetStatusResult> 
    </QueueEntryGetStatusResponse> 
    </soap:Body> 
</soap:Envelope> 

这是PHP代码

$client = new SoapClient("http://YOURIP/yourservice.asmx?wsdl",array(
         'exceptions'=>true, 
         'cache_wsdl'=>WSDL_CACHE_NONE, 
         'encoding'=>'utf-8')); 
$params = array(
    'BuffID' => 134 
    ); 

try 
    { 
     $result = $client->QueueEntryGetStatus($params); 
     $status = $result->QueueEntryGetStatusResult; 
     /*do something*/ 
    } 
    catch (Exception $e) 
    { 
     $e -> getMessage(); 
     /*do something*/ 
    }