我试图通过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在创建客户端时提供了一个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"
这有http,而不是https.有关?
更新3:
使用调试器将"javax.xml.ws.service.endpoint.address"更改为https url而不是http时,我的客户端可以正常工作.但为什么它开始是http?
一个原因可能是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"/>
这可以说明你所看到的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();