Devo chiamare un servizio WCF protetto da java utilizzando l'autenticazione reciproca. Tutto funziona correttamente, tranne che non riesco a inviare messaggi con dimensioni superiori a 48680 byte. Quindi i messaggi di 48680 byte vengono inviati correttamente, ma 48681 byte - non lo sono, e l'applicazione java ha esito negativo con un'eccezione di timeout di lettura, sebbene le impostazioni delle quote di WCF consentano messaggi molto più grandi.Impossibile inviare un messaggio 48681 byte per proteggere il servizio wcf da java
Quindi quale potrebbe essere il problema?
EDIT
Il codice sorgente:
package foo.bar;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import javax.net.ssl.*;
import java.io.*;
import java.net.URL;
import java.security.KeyStore;
public class ReadTimedOutTest {
@Test
public void testReadTimedOut() throws Exception {
URL url = new URL("https://services/endpoint/");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
setUpSSL(connection);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("SOAPAction", "http://namespace/2012/01/service/Operation");
connection.setRequestProperty("Accept", "*/*");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
connection.setConnectTimeout(10 * 1000);
connection.setReadTimeout(10 * 1000);
connection.setInstanceFollowRedirects(true);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
InputStream is = ReadTimedOutTest.class.getResourceAsStream("payload.failure.xml");
try {
IOUtils.copy(is, bos);
} finally {
is.close();
}
byte[] bytes = bos.toByteArray();
connection.setRequestProperty("Content-Length", String.valueOf(bytes.length));
OutputStream os = connection.getOutputStream();
try {
IOUtils.copy(new ByteArrayInputStream(bytes), os);
os.flush();
} finally {
os.close();
}
int respCode = connection.getResponseCode();
if(respCode >= HttpsURLConnection.HTTP_INTERNAL_ERROR) {
is = connection.getErrorStream();
try {
IOUtils.copy(is, System.err);
} finally {
is.close();
}
} else {
is = connection.getInputStream();
try {
IOUtils.copy(is, System.out);
} finally {
is.close();
}
}
}
private void setUpSSL(HttpsURLConnection connection) throws Exception {
byte[] bytes = FileUtils.readFileToByteArray(new File("d:\\workspace\\temp\\keystore"));
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new ByteArrayInputStream(bytes), "changeit".toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");
keyManagerFactory.init(keyStore, "changeit".toCharArray());
bytes = FileUtils.readFileToByteArray(new File("d:\\workspace\\temp\\truststore"));
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new ByteArrayInputStream(bytes), "changeit".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");
trustManagerFactory.init(trustStore);
SSLContext context = SSLContext.getInstance("TLS");
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
SSLSocketFactory socketFactory = context.getSocketFactory();
connection.setSSLSocketFactory(socketFactory);
}
}
UPDATE
Ho testato il servizio con .net cliente WCF ed è stato in grado di invoca il serv ghiaccio con successo, quindi mi chiedo quale potrebbe essere il problema? Perché il client WCF è in grado di richiamare il servizio e il client Java, anche se l'ordinaria richiesta HTTP POST HTTP con UrlConnection non è?
UPDATE
Qui è campione di messaggio SOAP
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<DoSomethingUseful xmlns="http://namespace/2012/01/service">
...
</DoSomethingUseful>
</soap:Body>
</soap:Envelope>
UPDATE
mi è stato detto che sul lato servizio .NET ci sono "Client certificate is required. No certificate was found in the request" messaggi che sembrano verificarsi sulla ripresa della sessione ssl. Succede solo quando Content-Length è maggiore di 48680 byte. Anche il servizio WCF è configurato con basicHttpBinding per utilizzare la sicurezza del livello di trasporto.
Potrebbe fornire la configurazione del servizio WCF? –
Sfortunatamente questo è il servizio esterno utilizzato dall'organizzazione per cui lavoro. Probabilmente otterrò la configurazione entro lunedì. Il problema si verifica solo quando sto cercando di inviare la richiesta che è abbastanza grande. Quando si riceve una risposta importante non ci sono problemi. Lo sviluppatore del servizio WCF afferma che non ci sono problemi con la chiamata di questo servizio utilizzando il client .net dalla loro rete interna. – szhem
Stanno usando lo stesso endpoint dalla propria rete interna? –