使用https网址的Jax-ws最终为http

时间:2016-05-11 11:12:41

标签: java https jax-ws

我试图通过https使用JAX-WS调用Web服务(用C#开发)。我已经尝试通过SoapUI设置一个调用,这很有用。

但是,当尝试通过生成的jax-ws客户端执行相同操作时,我得到的只是301响应。这类似于我使用带有http url到同一服务的SoapUI,而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客户端时,我找到了这个属性:

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

这有http,而不是https。相关?

更新3:

使用调试器更改" javax.xml.ws.service.endpoint.address"到https网址,而不是http,我的客户端工作。但为什么它以http开头?

1 个答案:

答案 0 :(得分:6)

一个原因可能是WSDL引用了http URL。

  

new MyServiceInterface(new   URL( “https://acme.com/services/MyService.svc?wsdl”))                          .getMyPort()试验();

我建议下载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();