当前位置: 首页 > 知识库问答 >
问题:

试图使用spring-ws-“连接超时”访问WS服务器,但服务器在使用SOAP UI测试时会响应

井通
2023-03-14

我将接管java web服务客户机的开发工作,为了测试一个演化,我必须从远程web服务服务器(嵌入在tomcat实例中运行的Apache Axis2中)请求一个方法。

首先,我使用服务器提供的WSDL通过SOAP UI请求该方法。很好用。

现在我尝试通过我的Java web服务客户机请求该方法,但是我无法连接到服务器,尽管使用SOAP UI的测试证明它一切正常。

java web服务客户机依赖于Spring-WS。

// Setting the kycScoreRequest
...

// Trying to connect and to get the kycScoreResponse 
KycScoreResponse kycScoreResponse = (KycScoreResponse) getWebServiceTemplate().marshalSendAndReceive(kycScoreRequest);
[main] DEBUG com.foo.AbstractMain - org.springframework.ws.client.WebServiceIOException: I/O error: Connection timed out: connect; nested exception is java.net.ConnectException: Connection timed out: connect
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:545)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:386)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:380)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:372)
    at com.foo.MainKycScore.getReturn(MainKycScore.java:37)
    at com.foo.MainKycScore.main(MainKycScore.java:244)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(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)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
    at org.springframework.ws.transport.http.HttpComponentsConnection.onSendAfterWrite(HttpComponentsConnection.java:119)
    at org.springframework.ws.transport.AbstractWebServiceConnection.send(AbstractWebServiceConnection.java:47)
    at org.springframework.ws.client.core.WebServiceTemplate.sendRequest(WebServiceTemplate.java:624)
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:587)
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:539)
    ... 5 more
WebServiceGatewaySupport.setDefaultUri("http://82.36.138.182:8080/axis2/services/KYCService01.KYCService01HttpSoap11Endpoint/")
<wsdl:service name="KYCService01">
    <wsdl:port name="KYCService01HttpSoap11Endpoint" binding="ns:KYCService01Soap11Binding">
        <soap:address location="http://82.36.138.182:8080/axis2/services/KYCService01.KYCService01HttpSoap11Endpoint/"/>
    </wsdl:port>
</wsdl:service>
WebServiceGatewaySupport.setDefaultUri("http://82.36.138.182:8080/axis2/services/KYCService01")
System.setProperty("http.proxyHost", "<my_proxy_hostname>");
System.setProperty("http.proxyPort", "<my_proxy_port>");
URL wsdlAddress = null;
HttpURLConnection connection = null;

wsdlAdress = new URL("<wsdl_url>");
connection = (HttpURLConnection) wsdlAdress.openConnection();
connection.connect(); // It works if the proxy is set as System properties

不幸的是,当我试图用我的代理集调用web服务服务器时,我仍然会遇到与上面提到的完全相同的错误。现在我已经不知道了。我的Java客户机怎么可能访问web服务WSDL而不能访问它的方法呢?

多亏了膜拦截器,我从SOAP UI和WS客户端拦截了HTTP消息。请参阅标题:

SOAP UI

POST http://82.36.138.182:8080/axis2/services/KYCService01.KYCService01HttpSoap11Endpoint/ HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "urn:kycScore"
Content-Length: 1301
Host: 84.37.138.182:8080
Proxy-Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

WS客户机(目标URL是一个SOAP UI模拟服务器,因为很明显,如果我使用URL,我真的试图连接到没有发送任何东西,因此没有什么要拦截的东西)

POST /mock HTTP/1.1
Accept-Encoding: gzip
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
Content-Length: 1032
Host: localhost:8088
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_101)

我对http头一无所知,但主要区别似乎是SOAPAction。我将ws客户端消息的SOAPAction属性设置为与SOAP UI相同的值,但没有改变任何内容。

public Object marshalWithSoapActionHeader(KycScore o) {

        return getWebServiceTemplate().marshalSendAndReceive(o, new WebServiceMessageCallback() {

            public void doWithMessage(WebServiceMessage message) {
                ((SoapMessage) message).setSoapAction("urn:kycScore");
            }
        });
    }

共有1个答案

郭元明
2023-03-14

总结疑难解答提示,以尝试在注释中总结冗长的讨论:

  1. 尝试检查是否缺少任何必需的标头。
  2. 尝试访问服务的简单连接运行状况检查或pingendpoint。
  3. 如果一直出现连接超时,请尝试缩短连接超时。
  4. 如果无法连接,请检查防火墙规则。
  5. 使用内部开发的自定义客户端库时,请向了解该库的开发人员寻求帮助。
  6. 使用自定义客户端库时,将源附加到调试。
  7. 尝试复制一个模板,比如MyKong的SOAP Web服务示例,如果可以的话。
 类似资料:
  • 在我的文件中,我有... 我知道文件正在正确加载,因为服务器在端口8086上运行。 在应用程序中,我有一个 当我调用endpoint时,请求永远不会超时,它只是无限期地挂起。 我错过了什么吗? 注意:我还被告知,Tomcat使用这个字段是以分钟为单位,而不是以毫秒为单位(这在我看来是相当不寻常的选择)。我试着将它设置为< code > server . connection-time out =

  • 如何测试接收并返回

  • 我正在尝试使用SoapUI(5.0.0 beta)来测试RESTful Web服务,该服务会对提供的回调URL发出异步响应。 到目前为止,我能够调用该服务并确认收到的初始同步响应。我还创建了一个“REST MockService”,它对从服务器收到的回调发出适当的响应,并在初始请求中为此提供endpoint作为回调 URL。 我现在正在努力创建一个测试用例,将两者联系在一起,这样我就可以在继续我的

  • 问题内容: 尝试通过以下代码连接到 openfire 服务器时: 我得到一个异常说: 这可能是什么原因? 注意 :我已经允许openfire消防服务器通过防火墙。我也尝试过关闭防火墙,但是结果相同。服务器是我自己的机器。我尝试在其上运行程序的同一台计算机。 问题答案: 您可以使用 或者如果您想指定端口 或类似,默认为端口5222

  • 我使用最新版本的PsExec,并以管理员身份运行执行命令提示符。我们使用PsExec v2.11 执行简单的服务器连接测试(例如从我的机器my_机器到远程_服务器) 另一个域中的另一个伙伴,它获取拒绝访问错误。 要登录到计算机的用户是域\u伙伴\用户\u伙伴。 我检查了PSExec使用的端口445和135,它们都在远程_服务器上打开。其他领域。本地计算机: 可从资源管理器访问目录: 我得到访问被拒

  • 本文向大家介绍使用SQL Server连接服务器访问DB2 Server,包括了使用SQL Server连接服务器访问DB2 Server的使用技巧和注意事项,需要的朋友参考一下 首先,需要安装Microsoft OLE DB Provider for DB2 下载地址:http://download.microsoft.com/download/B/B/2/BB22098A-C071-415F-