使用https url的Jax-ws最终为http

Tob*_*obb 0 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();
Run Code Online (Sandbox Code Playgroud)

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

更新:

我已经使用接受的答案中的指南在问题中实现了对服务的SOAP请求:工作Soap客户端示例 几乎重复了来自SoapUI的信息,现在它给了我一个适当的200响应.

更新2:

在调试我的JAX-WS客户端时,我找到了这个属性:

"javax.xml.ws.service.endpoint.address" -> "http://acme.com/services/MyService.svc"
Run Code Online (Sandbox Code Playgroud)

这有http,而不是https.有关?

更新3:

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

Sco*_*lin 6

一个原因可能是WSDL引用了httpURL.

new MyServiceInterface(新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"/>
Run Code Online (Sandbox Code Playgroud)

这可以说明你所看到的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();
Run Code Online (Sandbox Code Playgroud)