2

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

服务器发送 HTTP 状态码 302: Moved Temporarily

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

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

我使用生成 web 服务代码wsimport并进行调用

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

我被困住了,我无法在任何地方找到解决方案,因此将不胜感激。

4

3 回答 3

17

因此,经过大量调查,我终于弄清楚了问题所在。这一切都归结为从http重定向到https。从我在网上找到的文章(不再记得网址)中,由于安全原因,wsdl2javawsimport存根生成器用于进行 Web 服务通信的库不允许遵循 http 到 https 的重定向。

因此,即使我是从 https wsdl 位置生成存根,即。https://wsdl.location.com?wsdl,当我运行代码进行网络服务调用时,它试图调用http://wsdl.location.com导致重定向请求到https:/ /wsdl.location.com,但 http 库不允许这样做。所以它只是将 302 http 代码作为异常转发。

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

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来检查这一点。它会说它正在拨打哪个网址。

我没有考虑或选择配置wsdl2javawsimport以生成存根并强制存根使用 https 调用的选项,以便我可以为不同的环境配置多个 url 端点。

于 2012-12-06T15:36:28.163 回答
0

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

于 2012-12-04T11:48:25.547 回答
0

原因是 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 文件位置生成新存根。

于 2014-06-25T05:44:05.453 回答