Php 无法使用mustUnderstand设置SOAP标头

Php 无法使用mustUnderstand设置SOAP标头,php,xml,soap,Php,Xml,Soap,以下是请求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/ISessionManag

以下是请求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>

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

SoapFault异常:[s:MustUnderstand]此邮件的收件人未理解命名空间“h”中的标头“ContractVersion”,导致邮件无法处理。此错误通常表示此消息的发送方启用了接收方无法处理的通信协议。请确保客户端绑定的配置与服务绑定一致。

如何解决此问题?因为WSDL只能从特定的IP访问,所以我给出了下面的链接


WSDL:

根据文档,语法应该是:

SoapHeader ( string $namespace , string $name , mixed $data , bool $mustunderstand )
$header = new SoapHeader('h','ContractVersion','330', '1');
在代码中,您将名称空间前缀放置在名称空间应位于的位置:

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');

您是否可以在此命名空间中包含指向XSD的链接:
https://trtestr3xapi.navitaire.com/SessionManager.svc?xsd=xsd3
也是吗?它不能从WSDL访问,并且它声明了您遇到问题的元素。您能详细说明一下吗?上面的URL指向一个文件(XSD模式),您可以在本地访问它。它由WSDL自动导入。其中有一个
ContractVersion
的元素声明。如果您也可以发布该文件,它可能有助于诊断问题。我认为它在该链接中是可见的。如果这不是您所指的,那么我需要询问API提供商。在该链接中,您发布了WSDL文档。该文档包含以下标记:
,它引用了描述
http://schemas.navitaire.com/WebServices
名称空间。您发布的链接中没有关于
ContractVersion
的信息。该信息在XSD中。该XSD发出错误SoapFault异常:[a:InternalServiceFault]对象引用未设置为对象的实例。在C:\Inetpub\vhosts\ezyfling.com\tiger\index.php:19堆栈跟踪:#0 C:\Inetpub\vhosts\ezyfling.com\tiger\index.php(19):SoapClient->uu调用('Logon',Array)#1 C:\Inetpub\vhosts\ezyfling.com\tiger\index.php(19):SoapClient->Logon(Object(stdClass))#2{main}错误!该错误意味着理解了标题,并且解决了您在问题中提出的问题。你现在遇到的是另一个问题,值得再问一个问题。当您制定另一个问题时,您应该包括导致该错误的
Logon
类型的XSD(您可能没有发送
Logon
对象所需的结构中的数据)。此外,您的
Logon
对象似乎需要一个数组。XSD可以显示该数组应该包含的内容。根据您的配置,您可能能够在实例化
SoapClient
时发送登录凭据。无论如何,那是另一个问题。啊!你能用我发送数据所需的结构更新你的答案吗?我厌倦了尝试不同的方法,并且精疲力尽。。。或者你可以给我一些提示,让我试试。我不知道。你没有服务部的文件吗?XSD将描述
Logon
对象的结构,但我不能保证它是足够的。你可能还需要处理其他细节。您应该要求提供商提供一个连接到服务的示例应用程序,并将其作为起点。