java - Jax-ws 与 https url 最终为 http

标签 java https jax-ws

我正在尝试使用 JAX-WS 通过 https 调用 Web 服务(用 C# 开发)。我尝试通过 SoapUI 设置调用,这有效。

但是,当尝试通过生成的 jax-ws 客户端执行相同操作时,我得到的只是 301 响应。这与我使用 SoapUI 和同一服务的 http url 得到的结果类似,而且wireshark 还告诉我我执行了 HTTP (HTTP/XML) POST 操作。这让我相信,出于某种原因,我生成的 JAX-WS 客户端尝试通过 http 而不是 https 进行调用。

示例代码:

 new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl"))
                       .getMyPort().test();

如您所见,我在创建客户端时提供了一个 https 网址。为了确保 JAX-WS 使用 https 还需要什么吗?命名空间 URI 都是 http,这会导致问题吗?

更新:

我已经使用此处接受的答案中的指南实现了对问题中服务的 SOAP 请求:Working Soap client example 几乎重复了 SoapUI 中的信息,现在它给了我正确的 200 响应。

更新2:

在调试我的 JAX-WS-client 时,我发现这个属性:

"javax.xml.ws.service.endpoint.address" -> "http://acme.com/services/MyService.svc"

这里有 http,没有 https。相关吗?

更新3:

当使用调试器将“javax.xml.ws.service.endpoint.address”更改为 https url 而不是 http 时,我的客户端可以正常工作。但为什么一开始是http呢?

最佳答案

原因之一可能是 WSDL 引用了 http网址。

new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl")) .getMyPort().test();

我建议下载https://acme.com/services/MyService.svc?wsdl并查看 <address><service> 内的端点。如果它看起来像这样:

<soap:address location="http://acme.com/services/MyService.svc"/>

这可以解释您在 javax.xml.ws.service.endpoint.address 中看到的内容.

如果是这种情况,并且您无法控制/修复远程 WSDL,则可能需要以编程方式覆盖端点:

MyServicePort myPort = new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl")).getMyPort();
// set endpoint to use https
String endpointURL = "https://acme.com/services/MyService.svc";
BindingProvider bp = (BindingProvider) myPort;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
myPort.test();

关于java - Jax-ws 与 https url 最终为 http,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37160902/

相关文章:

java - 如果继承了另一个Exception,Java会多次捕获一个Exception吗?

apache http 重定向到 https 多个重写条件

php - SSL 错误 : Secure Connection Failed

java - JAX-WS 端点中的 CDI 注入(inject)不起作用,导致 NPE

java - 在请求的方法中访问 SOAP 消息头

java - 启动失败的 Android Studio

java - 无法理解 apache POI 的 shiftRows 方法的工作

java - 对 Spring MVC 的 AJAX 调用有效,但未命中成功函数

python - 在 key /证书不匹配的情况下测试 TLS 证书身份验证

web-services - 为什么 JAX-WS 是 JDK 的一部分而 JAX-RS 不是?