Pourquoi est-ce que je reçois une java.net.SocketException: Erreur de réinitialisation de connexion du service Web via l'interface utilisateur SOAP et le client Java?
Je suis la conversion d'une application visual foxpro pour une application web java et une petite, mais importante de l'application effectue une requête soap à un service web.
J'ai écrit 3 test les clients à appeler ce service web, et j'ai aussi testé via SOAP UI. Chacun de mes tests de ce service web renvoie l'erreur: java.net.Exception socketexception: la réinitialisation de la Connexion. Donc, je suis évidemment manquant la même chose dans chaque méthode de test, ou de faire la même chose de mal.
J'ai le code de foxpro, et j'ai réussi à la demande via foxpro et a reçu une réponse valide. Mais je n'ai pas d'expérience avec Foxpro, donc j'ai été aux prises avec la différence entre le code dans foxpro qui fonctionne et le nouveau code que j'ai écris en java.
Je suis en espérant que quelqu'un avec plus d'expérience avec du Savon et de services web peuvent voir mon code, peut-être essayer eux-mêmes, et de m'aider à comprendre quel est le problème.
Je vais donner l'url du service web ainsi que tout mon code. Je vais aussi donner la commande foxpro ligne de code qui fonctionne.
Le code de foxpro utilise CreateObject("Microsoft.XMLHTTP")
. J'ai appris par mes recherches que c'est aussi utilisé dans l'ASP, VB.net et C#.
1) Ici, c'est le service web que j'ai besoin d'appeler:
De l'hôte: https://rlisapi.myfwc.com/
De Soap: https://rlisapi.myfwc.com/wsReceipts.asmx
WSDL: https://rlisapi.myfwc.com/wsReceipts.asmx?WSDL
Ce service web ne contient pas de ws-security. Les informations d'identification sont dans la requête elle-même. Je ne peux pas fournir à ceux, bien sûr, mais je ne crois pas qu'ils sont nécessaires pour m'aider à résoudre le problème de connexion réinitialisée.
2) Premier client, j'ai créé utilisé SAAJ API. Voici mon code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.apache.log4j.Logger;
import com.mycompany.webapp.domain.transaction.BusinessEntityTransaction;
import com.mycompany.webapp.domain.transaction.ccars.PaymentCart;
import com.mycompany.webapp.domain.transaction.rlis.RlisTransaction;
public class RlisService {
private static Logger logger = Logger.getLogger("com.companyxyz.webapp.service.transaction.RlisService");
public List<BusinessEntityTransaction> getCurrentTransactions(PaymentCart paymentCart) {
List<BusinessEntityTransaction> transactionList = new ArrayList<BusinessEntityTransaction>();
List<RlisTransaction> rlisList = new ArrayList<RlisTransaction>();
try {
logger.info("Adding current transactions from RLIS system...");
rlisList = this.getCurrentTransactionsViaSoapRequest();
for (RlisTransaction tx : rlisList){
//add transaction received from web service to transactionList
}
} catch (UnsupportedOperationException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
}
//do something with the rlisList - the list of RlisTransactions
return transactionList;
}
private List<RlisTransaction> getCurrentTransactionsViaSoapRequest()
throws UnsupportedOperationException, SOAPException {
List<RlisTransaction> rlisTransactions = new ArrayList<RlisTransaction>();
//Create SOAP Connection
try {
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
//Send SOAP Message to SOAP Server
String url = "https://rlisapi.myfwc.com/wsReceipts.asmx";
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), url);
//Process the SOAP Response
printSOAPResponse(soapResponse);
soapConnection.close();
} catch (TransformerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return rlisTransactions;
}
private static SOAPMessage createSOAPRequest() throws SOAPException, IOException {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
//String serverURI = "http://rlisapi.outdoorlicensesolution.com/";
//SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
//envelope.addNamespaceDeclaration("http://api.outdoorlicensesolution.com/RLIS/", serverURI);
//SOAP Body
SOAPBody soapBody = envelope.getBody();
Name bodyName = envelope.createName("getDailyReceipts", "rlis", "http://api.outdoorlicensesolution.com/RLIS/");
SOAPBodyElement getDailyReceiptsElement = soapBody.addBodyElement(bodyName);
//Name contentLenghName = envelope.createName("Content-Length");
Name consumerPinName = envelope.createName("ConsumerPIN");
Name agentIdName = envelope.createName("AgentID");
Name receiptDateName = envelope.createName("ReceiptDate");
//SOAPElement contentLengthElement = getDailyReceiptsElement.addChildElement(contentLenghName);
//contentLengthElement.addTextNode("494");
SOAPElement consumerPinElement = getDailyReceiptsElement.addChildElement(consumerPinName);
consumerPinElement.addTextNode("my-consumer-pin");
SOAPElement agentIdElement = getDailyReceiptsElement.addChildElement(agentIdName);
agentIdElement.addTextNode("000"); //not a real agent id
SOAPElement receiptDateElement = getDailyReceiptsElement.addChildElement(receiptDateName);
receiptDateElement.addTextNode("2013-07-01T00:00:00");
/*
//this is the soap request string from foxpro:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<getDailyReceipts xmlns="http://api.outdoorlicensesolution.com/RLIS/">
<Content-Length>494</Content-Length>
<ConsumerPIN>APIKEY</ConsumerPIN>
<AgentID>AGENTID</AgentID>
<ReceiptDate>SALEDATE</ReceiptDate>
</getDailyReceipts>
</soap:Body>
</soap:Envelope>
*/
soapMessage.saveChanges();
/* Print the request message */
System.out.print("Request SOAP Message = ");
soapMessage.writeTo(System.out);
System.out.println();
return soapMessage;
}
private static void printSOAPResponse(SOAPMessage soapResponse) throws TransformerException, SOAPException {
logger.debug(soapResponse.getSOAPBody());
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
Source sourceContent = soapResponse.getSOAPPart().getContent();
logger.debug("\nResponse SOAP Message = ");
System.out.print("\nResponse SOAP Message = ");
StreamResult result = new StreamResult(System.out);
transformer.transform(sourceContent, result);
}
}
(3) de La prochaine version de mon client utilise le Socket et OutputStreamWriter
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.apache.log4j.Logger;
import com.mycompany.webapp.domain.transaction.BusinessEntityTransaction;
import com.mycompany.webapp.domain.transaction.ccars.PaymentCart;
import com.mycompany.webapp.domain.transaction.rlis.RlisTransaction;
public class RlisService {
private static Logger logger = Logger.getLogger("com.companyxyz.webapp.service.transaction.RlisService");
public List<BusinessEntityTransaction> getCurrentTransactions(PaymentCart paymentCart) {
List<BusinessEntityTransaction> transactionList = new ArrayList<BusinessEntityTransaction>();
List<RlisTransaction> rlisList = new ArrayList<RlisTransaction>();
try {
logger.info("Adding current transactions from RLIS system...");
rlisList = this.getCurrentTransactionsViaXmlHttp();
for (RlisTransaction tx : rlisList){
//add transaction received from web service to transactionList
}
} catch (UnsupportedOperationException e) {
e.printStackTrace();
}
//do something with the rlisList
return transactionList;
}
private List<RlisTransaction> getCurrentTransactionsViaXmlHttp(){
List<RlisTransaction> rlisTransactions = new ArrayList<RlisTransaction>();
String xmldata = "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" +
"xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\">" +
"<soap:Body>" +
"<getDailyReceipts xmlns=\"http://api.outdoorlicensesolution.com/RLIS/\">" +
//"<Content-Length>494</Content-Length>" +
"<ConsumerPIN>APIKEY</ConsumerPIN>" +
"<AgentID>AGENTID</AgentID>" +
"<ReceiptDate>SALEDATE</ReceiptDate>" +
"</getDailyReceipts>" +
"</soap:Body>" +
"</soap:Envelope>";
try{
//Create socket
String hostname = "rlisapi.myfwc.com";
int port = 443;
InetAddress addr = InetAddress.getByName(hostname);
Socket sock = new Socket(addr, port);
//Socket sock = new Socket(hostname, port);
//Send header
String path = "https://rlisapi.myfwc.com/wsReceipts.asmx";
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
//You can use "UTF8" for compatibility with the Microsoft virtual machine.
wr.write("POST " + path + " HTTP/1.0\r\n");
wr.write("Host: rlisapi.myfwc.com\r\n");
wr.write("Content-Length: " + xmldata.length() + "\r\n");
wr.write("Content-Type: text/xml; charset=\"utf-8\"\r\n");
wr.write("\r\n");
//Send data
wr.write(xmldata);
wr.flush();
//Response
BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String line;
while((line = rd.readLine()) != null)
System.out.println(line);
} catch (Exception e) {
e.printStackTrace();
}
return rlisTransactions;
}
}
(4) j'en ai un similaire client de test qui utilise HttpUrlConnection
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class TestXmlClient {
public static void main(String[] args) {
String argUrl = "https://rlisapi.myfwc.com/wsReceipts.asmx";
System.out.println("Test XML Client");
String requestXml =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
"xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\">" +
"<soap:Body>" +
"<getDailyReceipts xmlns=\"http://api.outdoorlicensesolution.com/RLIS/\">" +
"<Content-Length>494</Content-Length>" +
"<ConsumerPIN>my-consumer-pin</ConsumerPIN>" +
"<AgentID>000</AgentID>" + //not real agent id
"<ReceiptDate>2013-07-01T00:00:00</ReceiptDate>" +
"</getDailyReceipts>" +
"</soap:Body>" +
"</soap:Envelope>" ;
System.out.println("Request: " + requestXml);
//try {
URL url;
OutputStreamWriter writer = null;
InputStreamReader reader = null;
HttpURLConnection con = null;
try {
url = new URL (argUrl);
con = (HttpURLConnection) url.openConnection();
URLConnection urlc = url.openConnection();
HttpURLConnection httpc = (HttpURLConnection)urlc;
//only interested in the length of the resource
httpc.setRequestMethod("HEAD");
int len = httpc.getContentLength();
System.out.println("length: " + len);
//specify that we will send output and accept input
con.setDoInput(true);
con.setDoOutput(true);
con.setConnectTimeout( 20000 ); //long timeout, but not infinite
con.setReadTimeout( 20000 );
con.setUseCaches (false);
con.setDefaultUseCaches (false);
//tell the web server what we are sending
//con.setRequestProperty ( "Content-Type", "text/xml" );
con.setRequestProperty ( "Content-Type", "text/xml; charset=utf-8" );
//con.setRequestProperty("Connection", "close");
writer = new OutputStreamWriter( con.getOutputStream() );
writer.write(requestXml);
writer.flush();
writer.close();
//reading the response
reader = new InputStreamReader( con.getInputStream() );
StringBuilder buf = new StringBuilder();
char[] cbuf = new char[ 2048 ];
int num;
while ( -1 != (num=reader.read( cbuf ))) {
buf.append( cbuf, 0, num );
}
String result = buf.toString();
System.err.println( "\nResponse from server after POST:\n" + result );
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println(e.getStackTrace());
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally{
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
//ignore...
}
}
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
//ignore...
}
}
if (con != null) {
try {
con.disconnect();
} catch (Exception e) {
//ignore...
}
}
}
}
}
Enfin, en plus de tous ces tests, les clients, j'ai aussi essayé de soumettre diverses demandes à l'aide de SOAP UI. Il est intéressant de noter, je n'arrivais pas à charger le fichier wsdl à partir de l'url j'ai donc enregistré le wsdl du code source dans un fichier local et de s'en servir.
Ici, c'est la demande générée par le Savon de l'INTERFACE utilisateur à partir du fichier wsdl:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:rlis="http://api.outdoorlicensesolution.com/RLIS/">
<soap:Header/>
<soap:Body>
<rlis:getDailyReceipts>
<!--Optional:-->
<rlis:ConsumerPIN>?</rlis:ConsumerPIN>
<rlis:AgentID>?</rlis:AgentID>
<rlis:ReceiptDate>?</rlis:ReceiptDate>
</rlis:getDailyReceipts>
</soap:Body>
</soap:Envelope>
WSDL enregistré localement:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://api.outdoorlicensesolution.com/RLIS/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://api.outdoorlicensesolution.com/RLIS/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://api.outdoorlicensesolution.com/RLIS/">
<s:element name="getDailyReceipts">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ConsumerPIN" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="AgentID" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="ReceiptDate" type="s:dateTime" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getDailyReceiptsResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="getDailyReceiptsResult" type="tns:ArrayOfReceipt" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfReceipt">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Receipt" nillable="true" type="tns:Receipt" />
</s:sequence>
</s:complexType>
<s:complexType name="Receipt">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="OrderID" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="TotalSaleAmount" type="s:decimal" />
<s:element minOccurs="1" maxOccurs="1" name="TaxCollectorFees" type="s:decimal" />
<s:element minOccurs="1" maxOccurs="1" name="OrderDate" type="s:dateTime" />
<s:element minOccurs="0" maxOccurs="1" name="OrderStatus" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="AmountToACH" type="s:decimal" />
<s:element minOccurs="1" maxOccurs="1" name="CustomerID" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="CustomerName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="ClerkUserName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="TarponTagBegin" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="TarponTagEnd" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="ErrorMessage" type="s:string" />
</s:sequence>
</s:complexType>
</s:schema>
</wsdl:types>
<wsdl:message name="getDailyReceiptsSoapIn">
<wsdl:part name="parameters" element="tns:getDailyReceipts" />
</wsdl:message>
<wsdl:message name="getDailyReceiptsSoapOut">
<wsdl:part name="parameters" element="tns:getDailyReceiptsResponse" />
</wsdl:message>
<wsdl:portType name="wsReceiptsSoap">
<wsdl:operation name="getDailyReceipts">
<wsdl:input message="tns:getDailyReceiptsSoapIn" />
<wsdl:output message="tns:getDailyReceiptsSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="wsReceiptsSoap" type="tns:wsReceiptsSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getDailyReceipts">
<soap:operation soapAction="http://api.outdoorlicensesolution.com/RLIS/getDailyReceipts" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="wsReceiptsSoap12" type="tns:wsReceiptsSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getDailyReceipts">
<soap12:operation soapAction="http://api.outdoorlicensesolution.com/RLIS/getDailyReceipts" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="wsReceipts">
<wsdl:port name="wsReceiptsSoap" binding="tns:wsReceiptsSoap">
<soap:address location="https://rlisapi.myfwc.com/wsReceipts.asmx" />
</wsdl:port>
<wsdl:port name="wsReceiptsSoap12" binding="tns:wsReceiptsSoap12">
<soap12:address location="https://rlisapi.myfwc.com/wsReceipts.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Je vais également vous fournir le code de Foxpro qui fonctionne:
*******************************************
SALEDATE = DATE()-1
XMLRESPONSE = ''
M.AGENTID = '000'
M.APIKEY = 'my-consumer-pin'
M.cSALEDATE = STR(YEAR(SALEDATE),4) + '-' + PADL(ALLTRIM(STR(MONTH(SALEDATE),2)),2,'0') + '-' + PADL(ALLTRIM(STR(DAY(SALEDATE),2)),2,'0') + 'T00:00:00'
TEXT TO XMLHTTP NOSHOW
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<getDailyReceipts xmlns="http://api.outdoorlicensesolution.com/RLIS/">
<Content-Length>494</Content-Length>
<ConsumerPIN>APIKEY</ConsumerPIN>
<AgentID>AGENTID</AgentID>
<ReceiptDate>SALEDATE</ReceiptDate>
</getDailyReceipts>
</soap:Body>
</soap:Envelope>
ENDTEXT
XMLHTTP = STRTRAN(XMLHTTP,'APIKEY',M.APIKEY)
XMLHTTP = STRTRAN(XMLHTTP,'AGENTID',M.AGENTID)
XMLHTTP = STRTRAN(XMLHTTP,'SALEDATE',M.cSALEDATE)
oHTTP = CreateObject("Microsoft.XMLHTTP")
oHTTP.Open("POST", "https://rlisapi.myfwc.com/wsReceipts.asmx", .F.)
oHTTP.setRequestHeader('Content-Type', 'text/xml; charset=utf-8 ')
oHTTP.Send(XMLHTTP)
DO CASE
CASE oHTTP.status = 200
XMLRESPONSE = oHTTP.ResponseText
RELEASE oHTTP
CASE oHTTP.status = 201
WAIT'PROCESSING PLEASE WAIT' WINDOW NOWAIT
RELEASE oHTTP
CASE oHTTP.status = 202
WAIT 'PROCESSING PLEASE WAIT' WINDOW NOWAIT
RELEASE oHTTP
CASE oHTTP.status = 400
RELEASE oHTTP
MESSAGEBOX("RLIS BAD REQUEST ERROR",0,'CCARS')
RETURN
CASE oHTTP.status = 401
RELEASE oHTTP
MESSAGEBOX("RLIS UNAUTHORIZED ERROR",0,'CCARS')
RETURN
CASE oHTTP.status = 403
RELEASE oHTTP
MESSAGEBOX("RLIS FORBIDDEN ERROR",0,'CCARS')
RETURN
CASE oHTTP.status = 404
RELEASE oHTTP
MESSAGEBOX("CONNECTION TO RLIS SITE NOT AVAILABLE",0,'CCARS')
RETURN
CASE oHTTP.status = 500
RELEASE oHTTP
MESSAGEBOX("RLIS INTERNAL SERVER ERROR",0,'CCARS')
RETURN
OTHERWISE
RELEASE oHTTP
MESSAGEBOX(oHTTP.status,0,'CCARS')
MESSAGEBOX("RLIS INTERNAL SERVER ERROR CODE " + STR(oHTTP.status,3,0),0,'CCARS')
RETURN
ENDCASE
MESSAGEBOX(XMLRESPONSE)
Ici, c'est la pleine stacktrace de l'erreur:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:422)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:460)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:863)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
at com.taxcollector.ccars.service.transaction.TestSoapClient.main(TestSoapClient.java:51)
De toutes mes recherches sur le dernier couple de jours, ce que j'ai déterminé, c'est que cette erreur est le plus souvent causée par le serveur de la fermeture de la connexion avant que le client fait de la lecture.
Au début, je pensais qu'il y avait quelque chose de mal avec le service web lui-même, mais depuis que je suis en mesure d'exécuter la commande foxpro et d'obtenir une réponse valable, qui ne peut pas être le cas.
J'ai essayé de changer beaucoup de préférences dans le Savon paramètres de l'INTERFACE utilisateur, y compris le délai d'attente du socket.
Aussi, mes demandes de ne pas passer par un serveur proxy.
Des suggestions ou conseils seront grandement appréciés!
Merci.
MIS À JOUR LE POST QUI SUIT
Voici la capture de Wireshark, de simples accusés de réception omis.
4034 2013-07-05 10:34:04.556901000 192.168.0.106 162.209.25.202 SSLv2 178 Client Hello
4038 2013-07-05 10:34:04.669714000 162.209.25.202 192.168.0.106 SSLv3 1386 Server Hello, Certificate, Server Hello Done
4040 2013-07-05 10:34:04.880678000 192.168.0.106 162.209.25.202 SSLv3 331 Client Key Exchange
4041 2013-07-05 10:34:04.885161000 192.168.0.106 162.209.25.202 SSLv3 72 Change Cipher Spec
4042 2013-07-05 10:34:04.887886000 192.168.0.106 162.209.25.202 SSLv3 127 Encrypted Handshake Message
4045 2013-07-05 10:34:05.142999000 162.209.25.202 192.168.0.106 TCP 54 https > 58365 [RST, ACK] Seq=2769 Ack=445 Win=4584 Len=0
Puis la série de messages répète.
Donc je pense que cette montre est qu'il y a d'abord une demande de connexion sur le fait du client ,ce qui a été reconnu par le serveur.
Puis il y avait un Client Bonjour, un Serveur Bonjour, Protocole de poignée de main Certificat de Serveur Bonjour Fait, le Client Échange de Clé, Changement de Cipher Spec, Chiffré Handshake Message, puis enfin la Connection Reset (RST) du serveur.
J'ai regardé ce que l'Expert Infos sur la dernière image de moyens, et il semble que cela pourrait signifier la séquence de protocole suspect, par exemple, la séquence n'était pas continu ou une retransmission a été détecté...
Ce encore a moi de me gratter la tête! Je ne comprends pas ce que je peut être en train de faire dans mon code, ou à partir de Savon de l'INTERFACE utilisateur qui pourrait causer ce réinitialisation de la connexion à partir du serveur. Et pourquoi il n'arrive pas à partir de la Microsoft.XMLHTTP post dans foxpro code... se Pourrait-il que ma demande est prise en envoyé que des fragments et le serveur n'accepte pas que?
Je pense que je vais essayer d'exécuter une capture wireshark lors de l'exécution de la commande foxpro, mais qui est sur un PC avec Windows 8, donc je dois d'abord comprendre comment l'exécuter en vertu de l'admin. La java client de test, je suis en cours d'exécution qui reçoit une réinitialisation de la connexion est sur mon mac.
En attendant, quelqu'un a une autre idée?
source d'informationauteur s_urbuteit
Vous devez vous connecter pour publier un commentaire.
Comme je peux le voir, tous vos exemples de fonctionner correctement.
Je vous recommande d'utiliser certains le suivi des paquets logiciels, comme wireshark ou fiddler, et de vérifier pour la demande/en-têtes de réponse. Peut-être il ya quelques informations supplémentaires (UserAgent, etc) que vous devez définir la connexion avant de demander l'OutputStream
================ Mise à JOUR ======================
Comme vous l'avez spécifié, le serveur vous demande d'activer SSLv3.
Utilisez-le avant l'établissement de la connexion
Je l'ai fait dans mon test, et il semblait se connecter, car je pourrais écrire le message soap à l'OutputStream, mais j'ai une Erreur 500 du serveur, ce qui est une bonne chose puisque c'est une werbservice défaut interne
Maintenant, vous devez trouver ce qui est mal dans le message soap, ou le message de données
================ Mise à JOUR 2 ======================
Fixe!
De préciser, je suis en utilisant le numéro de l'essai 4 (
HttpUrlConnection
)Il y a un manque d'espace à la fin de la 3e ligne du message
devrait être
cause obtient contatenated avec
xmlns:xsd
définition.J'ai eu cette réponse