使用jax-ws调用位于负载均衡器上的Web服务,返回http状态为302,但是当我使用SoapUI时它工作正常

当我使用jax-ws调用位于负载均衡器上的Web服务时,它会返回

服务器发送HTTP状态码302:暂时移动

然后失败,但是当我使用SoapUI时它工作正常。

有没有办法可以配置服务来正确处理这个问题?

我使用wsimport生成了webservice代码并进行调用

 NotificationWebService service = new NotificationWebService(wsdlLocation, qName); NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap(); String xmlString = serviceSoap.getRSAPublicKeyXMLString(); 

我被困住了,我无法在任何地方找到解决方案,所以任何帮助都会受到赞赏。

经过大量调查后,我终于找到了问题所在。 一切都归结为从http重定向到https。 从我在网上找到的文章(不能再记住url), wsdl2javawsimport存根生成器用于进行网络服务通信的库是否由于安全原因不允许http到https重定向。

即使我是从https wsdl位置生成存根,即。 https://wsdl.location.com?wsdl ,当我运行代码进行webservice调用时,它试图调用http://wsdl.location.com ,这导致了对https的重定向请求:/ /wsdl.location.com ,但http库不允许这样做。 所以它只是将302 http代码转发为exception。

此外,还有两个Web服务URL。 一个是测试服务,它是普通的http url,然后有一个生产服务器通过https。 因此,要解决这个问题,我所做的就是通过使用BindingProvider类来动态配置服务以使用我指定的端点(现在是https地址)。 这也允许我根据正在调用的环境动态指定,使用测试URL或生产一个ie。

 NotificationWebService service = new NotificationWebService(); NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap(); BindingProvider bindingProvider = (BindingProvider) serviceSoap; bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://wsdl.location.com"); String xmlString = serviceSoap.getRSAPublicKeyXMLString(); 

所以简而言之,如果有人遇到这个问题。 确保您需要指向的终点是否为https,您正在进行直接https呼叫,而不是要求进行https重定向的http呼叫。 您可以通过在调试时检查serviceSoap来检查这一点。 它会说它正在拨打哪个url。

我没有调查或选择配置wsdl2javawsimport来生成存根并强制存根使用https调用,这样我就可以为不同的环境配置多个url端点。

是。 你没有说你正在使用什么用于传输,但是如果它像HttpClient那样你需要将其设置为遵循重定向。 您可能需要使用自动生成的代码,或者尝试更高级别的抽象,例如Spring Web Services或CXF。

原因是Web服务调用控件上的重定向问题从HTTP转移到HTTPS。 编辑您的WSDL文件,您将找到以下代码:

原始代码:

 soap:address location="http://www.google.com/Services/Services_xyz.asmx" 

改变了代码:

 soap:address location="https://www.google.com/Services/Services_xyz.asmx" 

只需将位置属性HTTP更改为HTTPS,然后使用更改的WSDL文件位置生成新存根。