带有 https url 的 Jax-ws 以 http 结束
Jax-ws with https url ends up as http
我正在尝试通过 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 请求: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
URL。
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
中看到的内容。
如果是这种情况并且您不能 control/fix 远程 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();
我正在尝试通过 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 请求: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
URL。
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
中看到的内容。
如果是这种情况并且您不能 control/fix 远程 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();