无法使用mustUnderstand设置SOAP标头

时间:2014-06-07 16:31:03

标签: php xml soap

以下是Request XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://schemas.navitaire.com/WebServices/ISessionManager/Logon</Action>
<h:ContractVersion xmlns:h="http://schemas.navitaire.com/WebServices">330</h:ContractVersion>
</s:Header>
<s:Body>
<LogonRequest xmlns="http://schemas.navitaire.com/WebServices/ServiceContracts/SessionService">
  <logonRequestData xmlns:d4p1="http://schemas.navitaire.com/WebServices/DataContracts/Session" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <d4p1:DomainCode>WWW</d4p1:DomainCode>
    <d4p1:AgentName>API****</d4p1:AgentName>
    <d4p1:Password>********</d4p1:Password>
    <d4p1:LocationCode i:nil="true" />
    <d4p1:RoleCode>APIB</d4p1:RoleCode>
    <d4p1:TerminalInfo i:nil="true" />
  </logonRequestData>
</LogonRequest>
</s:Body>
</s:Envelope>

以下是我的PHP代码。

$test->DomainCode = 'WWW';
$test->AgentName = 'AGENT';
$test->Password = 'PASS';
$test->RoleCode = 'ROLE';

$wsdl = "https://trtestr3xapi.navitaire.com/sessionmanager.svc?wsdl";

$client = new SoapClient($wsdl, array('trace' => 1));


$header = new SoapHeader('h','ContractVersion','330', '1');
$client->__setSoapHeaders($header);

...

对于上面的代码,我收到以下错误。

  

SoapFault exception: [s:MustUnderstand] The header 'ContractVersion' from the namespace 'h' was not understood by the recipient of this message, causing the message to not be processed. This error typically indicates that the sender of this message has enabled a communication protocol that the receiver cannot process. Please ensure that the configuration of the client's binding is consistent with the service's binding.

如何解决此问题?由于WSDL只能从特定的IP访问,我已经给出了下面的链接

WSDL:http://pastie.org/9263788

1 个答案:

答案 0 :(得分:1)

根据SOAPHeader文档,语法应为:

SoapHeader ( string $namespace , string $name , mixed $data , bool $mustunderstand )

在您的代码中,您将名称空间前缀放在名称空间应该是:

$header = new SoapHeader('h','ContractVersion','330', '1');

将该行更改为:

$header = new SoapHeader('http://schemas.navitaire.com/WebServices','ContractVersion','330', 'true');