【问题标题】:Webservice with HTTPS使用 HTTPS 的 Web 服务
【发布时间】:2012-12-05 15:55:53
【问题描述】:

我有一个外部 Web 服务,它通过 https 工作,我可以使用 wsimport 生成 java 类,但是当我调用该服务时,我收到以下异常:

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.UnknownHostException: ECM01
at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(Unknown Source)
at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(Unknown Source)...
Caused by: java.net.UnknownHostException: ECM01
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)

我调用服务的类是这样的:

public static void main(String[] args) {
    ColleagueServiceService cs = new ColleagueServiceService();
    ColleagueService service = cs.getColleagueServicePort();

    try {
        service.getColleagues("user", "password", 1);
    } catch (Exception_Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我尝试使用 SoapUI 调用 web 服务,但它显示另一个异常:

Tue Dec 18 09:40:06 BRST 2012:ERROR:org.apache.http.conn.HttpHostConnectException: Connection to https://my.webservice.url.com refused
org.apache.http.conn.HttpHostConnectException: Connection to https://my.webservice.url.com refused
at com.eviware.soapui.impl.wsdl.support.http.SoapUIMultiThreadedHttpConnectionManager$SoapUIClientConnectionOperator.openConnection(SoapUIMultiThreadedHttpConnectionManager.java:321)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport$Helper.execute(HttpClientSupport.java:236)
at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport.execute(HttpClientSupport.java:345)
at com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport.sendRequest(HttpClientRequestTransport.java:241)
at com.eviware.soapui.impl.wsdl.WsdlSubmit.run(WsdlSubmit.java:123)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)...

Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)...

已编辑:

这个网络服务是我的,但它在一个外部服务器中,我看到我的班级 ColleagueService(不是我做的)它的注释是:

@WebService(serviceName="ColleagueServiceService")
@SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public class ColleagueService {

生成的 wsdl 我有这个:

<port binding="tns:ColleagueServiceBinding" name="ColleagueServicePort">
    <soap:address location="http://ECM01:80/services/ColleagueService"/>
</port>

外部服务器(一个客户端)有一个 jboss 服务器和一个 apache http 服务器,http 服务器通过 ProxyPass 将所有请求重定向到路径 /services/ 到 jboss 服务器(jboss 服务器是主机 ECM01),无论如何 wsdl 是错误的因为服务是 https 并且在 wsdl 我有 http

有人可以帮忙吗?谢谢。

【问题讨论】:

  • PS:我可以在浏览器中访问my.webservice.url.com/ColleagueService?wsdl
  • 你是否有任何机会在代理背后?
  • @AndersR.Bystrup 是的,在我的 Intranet 中有一个代理。
  • 您访问的 URL 在您的网络之外?在这种情况下,您需要让您的 HTTP 客户端代码知道代理主机、端口和可能的身份验证。
  • 是的,该 URL 在我的网络之外,我该怎么做?我可以使用 wsimport -httpproxy 吗?

标签: java web-services wsdl


【解决方案1】:

原因:java.net.UnknownHostException: ECM01

这是 WSDL 中指定的主机吗?寻找这样的部分:

<wsdl:port binding="tns:FooBinding" name="FooPort">
  <soap:address location="https://ECM01/FooService"/>
</wsdl:port>

如果是这样,您必须在端口上set the endpoint

BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext()
    .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint);

这将是其他任务的补充,例如提供proxy configuration 作为Anders R. Bystrup 提及和(可能)configuring SSL client certificates


WSDL 不反映真实的服务端点是完全正常的。在我工作过的任何地方,都会使用已知的错误 URI(例如,本地主机,其中所有内容都分布在不同的主机上。)客户端可以通过配置机制显式设置端点(请参阅上面的 JAX-WS 客户端代码。)这允许灵活性在开发期间并防止在从开发过渡到生产期间使用错误的主机。

也就是说,当使用自动生成的 WSDL 时,我认为如何生成 SOAP 地址元素是您的 JAX-WS 实现的一个实现细节。我不确定,因为我从来没有依赖过它。我会参考您的容器实现的文档。

【讨论】:

  • 谢谢@McDowller,我想你找到了我的问题,我认为我的wsdl 错了,你能帮帮我吗?查看我在帖子中编辑的内容。
  • 谢谢。这行得通。奇怪的是。这只发生在我使用 apache 代理服务 WSDL 及其服务时。
猜你喜欢
  • 2016-06-30
  • 2011-08-03
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2013-10-10
  • 2011-02-25
  • 2014-12-20
  • 1970-01-01
相关资源
最近更新 更多