PHP致命错误:“在消息上指定的SOAP操作''与HTTP SOAP Action不匹配”

时间:2012-01-19 22:32:16

标签: php soap

我正在尝试编写一个PHP脚本,该脚本将连接到SightMax接口的SOAP客户端。使用下面的代码,我可以打印出可用的函数列表,但是当我尝试调用任何函数时,我收到以下错误。

<?php

$client = new SoapClient('http://domain.com/SightMaxWebServices/SightMaxWebService.svc?wsdl', array('soap_version' => SOAP_1_2));

var_dump($client->__getFunctions());

$result = $client->__call("GetSiteSummary", array());

echo "<pre>";
print_r($result);
echo "</pre>";

?>

Fatal error: Uncaught SoapFault exception: [s:Sender] The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'SmartMax.SightMax.Agent.Operator/IRemotedWebsiteAdministrator/GetSiteSummary'. in test2.php:7 Stack trace: #0 test2.php(7): SoapClient->__call('GetSiteSummary', Array) #1 {main} thrown in test2.php on line 7 

我在过去几天一直在研究这个错误,我读过不同的文章,说明可能存在的问题。根据我的理解,发生此错误是因为SOAP客户端是为wsHttpBinding配置的,并且PHP的SOAP客户端中的构建不支持wsHttpBinding,或者我需要专门指定SOAP操作。

任何人都可以为我阐明这一点吗?请记住,当我精通PHP时,使用SOAP对我来说是新的,所以一步一步非常有帮助。

先谢谢。

2 个答案:

答案 0 :(得分:17)

WCF似乎在寻找SOAP信封中的操作。您可以通过这种方式使用PHP的SoapClient将其添加到您的调用中:

$actionHeader = new SoapHeader('http://www.w3.org/2005/08/addressing',
                               'Action',
                               'http://soapaction.that.was.in.the.wsdl');
$client->__setSoapHeaders($actionHeader);

如果更改第三个参数并在$ client和__call()的实例化之间添加它,那么它应该清除错误(并且可能带来新的错误,这不是SOAP的乐趣吗?)

另外FYI,刚刚遇到同样的问题,我发现__getLastRequestHeaders(),__ getLastRequest(),__ getLastResponseHeaders()和__getLastResponse()函数非常方便,看看我尝试的是否有任何影响(注意你需要在SoapClient选项中添加“trace”=&gt;“1”才能使用。)

答案 1 :(得分:0)

您应该提供SOAP Action。由于您未在SoapClient的初始化中包含它,因此它与Web服务的SOAP Action不匹配。确保在连接之前知道SOAP Action是什么。

请阅读http://www.oreillynet.com/xml/blog/2002/11/unraveling_the_mystery_of_soap.html了解有关此主题的更多信息。