Sabre SOAP请求报错:wsse:Security前缀未绑定问题求助
问题分析与解决方案
这个错误的根源很明确:你在SOAP请求里使用了wsse前缀来标记WS-Security相关元素,但没有在根<soapenv:Envelope>标签的命名空间声明中绑定wsse前缀到对应的WS-Security命名空间。
看你的请求报文,根标签里声明的是:
xmlns:sec="http://schemas.xmlsoap.org/ws/2002/12/secext"
这里用的前缀是sec,但你后续的安全元素用的是wsse:Security、wsse:UsernameToken,XML解析器找不到wsse对应的命名空间,自然会抛出这个错误。
两种修正方案
方案1:修改命名空间前缀为wsse
直接把根标签里的sec前缀改成wsse,这样和你使用的元素前缀保持一致:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:mes="http://www.ebxml.org/namespaces/messageHeader" xmlns:web="http://webservices.sabre.com"> <soapenv:Header> <mes:MessageHeader mes:version="1"> <mes:From> <mes:PartyId>Client</mes:PartyId> </mes:From> <mes:To> <mes:PartyId>SWS</mes:PartyId> </mes:To> <mes:CPAId>DCG</mes:CPAId> <mes:ConversationId>123</mes:ConversationId> <mes:Service>Session</mes:Service> <mes:Action>TokenCreateRQ</mes:Action> <mes:MessageData> <mes:MessageId>1234</mes:MessageId> <mes:Timestamp>2015-01-01T00:00:00</mes:Timestamp> </mes:MessageData> </mes:MessageHeader> <wsse:Security> <wsse:UsernameToken> <wsse:Username>USER</wsse:Username> <wsse:Password>PASSWORD</wsse:Password> <Organization>PCC</Organization> <Domain>DOMAIN</Domain> </wsse:UsernameToken> </wsse:Security> </soapenv:Header> <soapenv:Body> <web:TokenCreateRQ Version="1.0.0"/> </soapenv:Body> </soapenv:Envelope>
方案2:修改元素前缀为sec
保持根标签的命名空间声明不变,把所有wsse:前缀替换成sec::
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sec="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:mes="http://www.ebxml.org/namespaces/messageHeader" xmlns:web="http://webservices.sabre.com"> <soapenv:Header> <mes:MessageHeader mes:version="1"> <mes:From> <mes:PartyId>Client</mes:PartyId> </mes:From> <mes:To> <mes:PartyId>SWS</mes:PartyId> </mes:To> <mes:CPAId>DCG</mes:CPAId> <mes:ConversationId>123</mes:ConversationId> <mes:Service>Session</mes:Service> <mes:Action>TokenCreateRQ</mes:Action> <mes:MessageData> <mes:MessageId>1234</mes:MessageId> <mes:Timestamp>2015-01-01T00:00:00</mes:Timestamp> </mes:MessageData> </mes:MessageHeader> <sec:Security> <sec:UsernameToken> <sec:Username>USER</sec:Username> <sec:Password>PASSWORD</sec:Password> <Organization>PCC</Organization> <Domain>DOMAIN</Domain> </sec:UsernameToken> </sec:Security> </soapenv:Header> <soapenv:Body> <web:TokenCreateRQ Version="1.0.0"/> </soapenv:Body> </soapenv:Envelope>
补充说明
Sabre的SOAP服务遵循WS-Security规范,http://schemas.xmlsoap.org/ws/2002/12/secext是标准的WS-Security命名空间。XML的命名空间前缀和声明必须严格对应,这是XML解析的基本规则——解析器无法识别未绑定的前缀,所以才会抛出这个错误。
内容的提问来源于stack exchange,提问作者José Mendes
相关产品推荐
相关产品推荐

