【问题标题】:SOAP:Cannot make call to the remote method.Remote host did not respondSOAP:无法调用远程方法。远程主机没有响应
【发布时间】:2017-02-13 22:56:42
【问题描述】:

我正在通过 jar 访问 https Webservice,服务被创建并且端口也被实例化,但是当尝试调用 Web 服务的远程方法时,它会抛出以下错误。

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.ConnectException: A remote host did not respond within the timeout period.

请注意,我将覆盖主机名验证器以验证所有主机名,因为添加到密钥库的证书与我通过我的 jar 访问的 Web 服务的 URL 具有不同的 CN。

javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
                            new javax.net.ssl.HostnameVerifier(){

                                public boolean verify(String hostname,
                                        javax.net.ssl.SSLSession sslSession) 
                                {
                                    mylog.setLog("Hostname Verification successfully overriden.");
                                    return true;
                                }
                            });

我使用的工具是 CXF。以下是完整的堆栈跟踪。

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.ConnectException: A remote host did not respond within the timeout period.
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:133)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:154)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:95)
    at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:117)
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:599)
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:558)
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:543)
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:440)
    at com.sun.xml.internal.ws.client.Stub.process(Stub.java:223)
    at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:136)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:110)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:90)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:119)
    at com.sun.proxy.$Proxy25.transferFileService(Unknown Source)
    at com.mywsclient.cxf.transfer.FileTransfer.transferToWebService(FileTransfer.java:183)
    at com.mywsclient.cxf.transfer.FileTransfer.run(FileTransfer.java:236)
    at java.lang.Thread.run(Thread.java:738)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:908)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:931)
    at java.lang.Thread.run(Thread.java:738)
Caused by: java.net.ConnectException: A remote host did not respond within the timeout period.
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:243)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:230)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:377)
    at java.net.Socket.connect(Socket.java:539)
    at java.net.Socket.connect(Socket.java:488)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:424)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:538)
    at com.ibm.net.ssl.www2.protocol.https.c.<init>(c.java:64)
    at com.ibm.net.ssl.www2.protocol.https.c.a(c.java:65)
    at com.ibm.net.ssl.www2.protocol.https.d.getNewHttpClient(d.java:15)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:978)
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:32)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1043)
    at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:79)
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:121)
    ... 19 more

【问题讨论】:

  • 远程端点正确吗?
  • @Reimeus 我在创建服务对象时指定了 url,它正在下载 wsdl,我想在调用远程方法时会结转相同的 url。
  • @Reimeus 遇到了问题,我正在从数据库中动态加载 url,并且下载的 wsdl 中的端点具有无法访问的不同端点。用相同的 url 覆盖端点那就是让 wsdl 解决它。

标签: java ssl soap


【解决方案1】:

终于解决了这个问题,正在使用的端点与 wsdl 所在的 url 不同。设法用具有 wsdl 的 URL 覆盖相同并且它有效。(请注意,我使用的是用于定位 wsdl 的动态 URL)。下面是设置端点的代码。

BindingProvider bp = (BindingProvider) port;
Map<String, Object>req_context_map=bp.getRequestContext();
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, my_url);

干杯。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2012-04-09
    相关资源
    最近更新 更多