【问题标题】:PHP Fatal error: "The SOAP action specified on the message, '', does not match the HTTP SOAP Action"PHP 致命错误:“消息上指定的 SOAP 操作,'',与 HTTP SOAP 操作不匹配”
【发布时间】:2012-01-19 22:32:15
【问题描述】:

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

<?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 对我来说是新的,所以一步一步非常有帮助。

提前致谢。

【问题讨论】:

  • 你试过省略new SoapClient 中的版本参数吗? Soap 1.2 不使用 SOAP 操作标头,而 1.1 使用。可能是,服务器只理解 1.1?
  • 当我删除 SOAP_1_2 版本参数时,我得到一个不同的错误致命错误:未捕获的 SoapFault 异常:[HTTP] 无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml;字符集=utf-8'。在 test2.php:5 堆栈跟踪:#0 [内部函数]:SoapClient->__doRequest('__call('GetSiteSummary', Array) #2 {main} 在 /var/www/tools/html/whoseonchat/test2 中抛出。第5行的php

标签: php soap


【解决方案1】:

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 选项中才能正常工作。)

【讨论】:

  • 这很好用。如果找不到 Action,则它在具有以下属性的 wsdl 中:
  • 很好的答案!非常感谢。
  • 这个答案拯救了我的一天!此外,这个答案非常有帮助:stackoverflow.com/a/32641267/1795351
【解决方案2】:

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

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

【讨论】:

  • 我已经阅读了这篇文章,但我仍然不明白。如何在我的脚本中明确声明 SOAP 操作?
  • 我不知道,我只是告诉你应该让你知道 SOAP Action 应该是什么。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多