我正在尝试编写一个 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() 和 __getLastResponse() 函数非常方便,可以查看我尝试的操作是否有任何效果(请注意,您需要将 "trace"=> "1"添加到您的 SoapClient 选项中才能工作。)
关于PHP fatal error : "The SOAP action specified on the message, ' ', 与 HTTP SOAP 操作不匹配”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8934365/