SOAPAction HTTP头识别异常:第三方预订SOAP服务调用故障排查
解决SOAP客户端的"Unrecognized value of HTTP Header SOAPAction"错误
这个问题的核心原因很明确:你的SOAP客户端没有正确设置SOAPAction HTTP请求头,而你调用的ASMX SOAP服务(从端点.asmx能看出来)对这个头的正确性有严格要求。
第一步:获取正确的SOAPAction值
你可以通过两种方式拿到这个值:
- 打开你验证过的SOAPUI请求,切换到"Headers"标签页,找到
SOAPAction字段的值(通常是一个类似"http://webservices.****/FutureBookingSummaryRequest"的URI); - 直接查看目标服务的WSDL文档,找到对应
<operation>节点下的<soap:operation>元素,它的soapAction属性值就是你需要的。
第二步:在Java代码中添加SOAPAction头设置
修改你现有的WebServiceMessageCallback实现,在处理SOAP Header的逻辑前后,添加设置SOAPAction的代码:
@Override public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException{ try { // 先设置SOAPAction头 SoapMessage soapMessage = (SoapMessage) message; // 替换成你从SOAPUI/WSDL中拿到的实际SOAPAction值 soapMessage.setSoapAction("http://webservices.****/FutureBookingSummaryRequest"); // 你原来的OG Header处理逻辑... OGHeader ogHeader = new OGHeader(); ogHeader.setTransactionID("****"); ogHeader.setPrimaryLangID("**"); ogHeader.setChannelValidation(false); log.debug("Created ogHeader"); OGHeaderAuthentication ogHeaderAuth = new OGHeaderAuthentication(); OGHeaderAuthenticationUserCredentials ogHeaderAuthUserCredentials = new OGHeaderAuthenticationUserCredentials(); ogHeaderAuthUserCredentials.setUserName("******"); ogHeaderAuthUserCredentials.setUserPassword("****"); ogHeaderAuthUserCredentials.setDomain("***"); ogHeaderAuth.setUserCredentials(ogHeaderAuthUserCredentials); ogHeader.setAuthentication(ogHeaderAuth); SoapHeader soapHeader = soapMessage.getSoapHeader(); log.debug("Got header from the SOAP message"); ObjectFactory factory = new ObjectFactory(); OGHeader futureBookingsummarySoapHeaders = factory.createOGHeader(); futureBookingsummarySoapHeaders.setAuthentication(ogHeaderAuth); JAXBElement<OGHeader> headers = factory.createOGHeader(futureBookingsummarySoapHeaders); log.debug("Header element created"); JAXBContext context = JAXBContext.newInstance(OGHeader.class); Marshaller marshaller = context.createMarshaller(); log.debug("Marshaller created"); marshaller.marshal(headers, soapHeader.getResult()); } catch (Exception e) { log.error("error during marshalling of the SOAP headers", e); } }
额外检查点
还要确认你的JAXB生成的OGHeader类的命名空间是否和SOAPUI请求中的一致(即http://webservices.****),如果命名空间不匹配,服务端也可能无法正确解析你的请求头,导致后续错误。
修改完成后重新测试,应该就能解决这个SOAPAction头的错误了。
内容的提问来源于stack exchange,提问作者kingabdr
相关产品推荐
相关产品推荐

