it-swarm.com.de

Der Versuch, mit Spring-WS auf einen WS-Server zuzugreifen - "Zeitüberschreitung der Verbindung", aber der Server antwortet beim Testen mit SOAP Benutzeroberfläche

Das Problem

Ich übernehme die Entwicklung eines Java-Webdienst-Clients und um eine Entwicklung zu testen, muss ich eine Methode von einem entfernten Webdienst-Server anfordern (der in einen Apache Axis2 eingebettet ist, der in einer Tomcat-Instanz ausgeführt wird).

Zunächst habe ich die Methode über die Benutzeroberfläche von SOAP mithilfe der vom Server bereitgestellten WSDL angefordert. Es funktioniert gut.

Jetzt versuche ich, die Methode über meinen Java-Webdienst-Client anzufordern, aber ich kann keine Verbindung zum Server herstellen, obwohl der Test mit SOAP UI beweist, dass alles in Ordnung ist.

Der Java-Webdienst-Client ist auf Spring-WS angewiesen.


Aufrufen des Webdienstes vom Client aus

// Setting the kycScoreRequest
...

// Trying to connect and to get the kycScoreResponse 
KycScoreResponse kycScoreResponse = (KycScoreResponse) getWebServiceTemplate().marshalSendAndReceive(kycScoreRequest);

Der resultierende Fehler

[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

Hypothese 1: Verwende ich die richtige Webdienst-URL?

Ich bin mir ziemlich sicher, dass Spring die richtige URL erhält, da es die gleiche ist, wie zuvor, als ich den Code übernommen habe, und nichts an der wsdl oder dem Server geändert hat ( und unser Client hat sich nie beschwert, es hat für ihn funktioniert, aber Niemals auf unseren Maschinen bei der Arbeit . Also frag mich nicht, wie der Entwickler vor mir es getestet hat, obwohl es nicht funktioniert hat, weil idk):

WebServiceGatewaySupport.setDefaultUri("http://82.36.138.182:8080/axis2/services/KYCService01.KYCService01HttpSoap11Endpoint/")

Ich habe folgendes in der WSDL:

<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>

Ich habe stattdessen auch die EPR als URL ausprobiert, aber es ändert nichts:

WebServiceGatewaySupport.setDefaultUri("http://82.36.138.182:8080/axis2/services/KYCService01")

Hypothese 2: Ist es der Proxy, hinter dem ich stehe?

Dann dachte ich, dass der Fehler durch den Proxy verursacht worden sein muss, hinter dem ich stehe. In der Tat, als ich versuchte, ein kleines Stück Code zu schreiben, um eine Verbindung zur wsdl-URL herzustellen, konnte ich zunächst keine Verbindung herstellen und bekam eine Zeitüberschreitung. Um dieses Problem zu beheben, habe ich den Proxy als Java-Systemeigenschaften festgelegt, sodass ich jetzt vom Webdienst-Client aus auf die WSDL zugreifen kann.

Proxy einstellen

System.setProperty("http.proxyHost", "<my_proxy_hostname>");
System.setProperty("http.proxyPort", "<my_proxy_port>");

Herstellen einer Verbindung mit der WSDL-URL

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

Wenn ich versuche, den Webservice-Server mit meinem Proxy-Set anzurufen, habe ich leider immer noch genau den gleichen Fehler wie oben erwähnt. Jetzt habe ich schon keine Ahnung mehr. Wie ist es möglich, dass mein Java-Client auf den Webdienst WSDL zugreifen kann, aber nicht auf dessen Methoden?


(edit) Hypothese 3: Ist es der http-Header?

Ich habe die HTTP-Nachricht von SOAP UI und dem WS-Client dank Membran-Interceptor abgefangen. Siehe die Überschriften:

SOAP-Benutzeroberfläche

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-Client (die Ziel-URL ist ein SOAP UI-Mock-Server, da offensichtlich, wenn ich die URL verwende, die ich wirklich versuche, eine Verbindung herzustellen, nichts gesendet wird und daher nichts abzufangen ist)

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)

Ich weiß eigentlich nichts über http-Header, aber der Hauptunterschied scheint SOAPAction zu sein. Ich habe das SOAPAction-Attribut meiner ws-Clientnachricht auf den gleichen Wert wie SOAP UI festgelegt, aber es hat nichts geändert.

public Object marshalWithSoapActionHeader(KycScore o) {

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

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

Ist es ansonsten möglich, dass die Java-Version, die wir im User-Agent-Attribut sehen, wichtig ist? (edit) Ich glaube nicht, weil ich versucht habe, ein 1.6 jre zu verwenden und die Version im User-Agent-Attribut geändert wird, aber ich habe immer noch den gleichen Fehler.

6
Flyout

Fassen Sie Tipps zur Fehlerbehebung zusammen, um die langwierigen Diskussionen in Kommentaren zusammenzufassen:

  1. Prüfen Sie, ob Ihnen die erforderlichen Header fehlen.
  2. Versuchen Sie, auf eine einfach zu verbindende Integritätsprüfung oder einen Ping-Endpunkt des Dienstes zuzugreifen.
  3. Versuchen Sie, das Zeitlimit für die Verbindung zu verringern, wenn Sie weiterhin ein Zeitlimit für die Verbindung erhalten.
  4. Suchen Sie nach Firewall-Regeln, wenn Sie keine Verbindung herstellen können.
  5. Wenn Sie benutzerdefinierte Client-Bibliotheken verwenden, die im eigenen Haus entwickelt wurden, wenden Sie sich an Entwickler, die diese Bibliothek kennen, um Hilfe.
  6. Wenn Sie benutzerdefinierte Client-Bibliotheken verwenden, fügen Sie dem Debug Quellen hinzu.
  7. Versuchen Sie, eine Vorlage wie myKongs SOAP Web Service-Beispiel zu kopieren, wenn Sie damit durchkommen.
3
entpnerd

Bitte überprüfen Sie die Proxy-Einstellungen in Ihrem Internet Explorer

1
DevEmani

Mögliche Lösungen 1. Versuchen Sie, über den Browser auf die WSDL zuzugreifen. 2. Überprüfen Sie, ob in der Benutzeroberfläche SOAP bereits Autorisierungsheader oder Proxy-Einstellungen konfiguriert wurden

0
DevEmani