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


PHP Fatal error: "The SOAP action specified on the message, '', does not match the HTTP SOAP Action"

我正在尝试编写一个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对我来说是新的,所以一步一步的操作非常有帮助。

提前感谢。

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不是很有趣吗?)

同样仅供参考,刚刚经历了同样的问题,我发现__getLastRequestHeaders()、__getLastRequest()、___getLastResponseHeaders(

您应该给出SOAP操作。由于SoapClient的初始化中没有包含它,因此它与web服务的SOAP Action不匹配。在连接之前,请确保您知道SOAP操作是什么。

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