web-dev-qa-db-fra.com

Pourquoi je reçois une exception Java.net.SocketException: erreur de réinitialisation de connexion du service Web via SOAP UI et Java client?

Je convertis une application Visual FoxPro en une application Web Java et une petite mais importante partie de l'application fait une demande de savon à un service Web.

J'ai écrit 3 clients de test pour appeler ce service Web, et j'ai également testé via SOAP UI. Chacun de mes tests sur ce service Web renvoie l'erreur: Java.net.SocketException: Connection Donc, je manque évidemment la même chose dans chaque méthode de test, ou je fais mal la même chose.

J'ai le code foxpro et j'ai réussi à soumettre la demande via foxpro et j'ai reçu une réponse valide. Mais je n'ai aucune expérience avec Foxpro, j'ai donc eu du mal avec la différence entre le code de foxpro qui fonctionne et le nouveau code que j'écris en Java.

J'espère que quelqu'un ayant plus d'expérience avec Soap et les services Web pourra voir mon code, peut-être l'essayer lui-même et m'aider à comprendre quel est le problème.

Je fournirai l'url du service Web ainsi que tout mon code. Je fournirai également le code de ligne de commande foxpro qui fonctionne.

Le code foxpro utilise CreateObject("Microsoft.XMLHTTP"). J'ai appris grâce à mes recherches que cela est également utilisé dans ASP, VB.net et C #.

1) Voici le service Web que je dois appeler:

Hôte: https://rlisapi.myfwc.com/

Point final du savon: https://rlisapi.myfwc.com/wsReceipts.asmx

WSDL: https://rlisapi.myfwc.com/wsReceipts.asmx?WSDL

Ce service Web ne contient pas ws-security. Les informations d'identification se trouvent dans la demande elle-même. Je ne peux pas les fournir, bien sûr, mais je ne pense pas qu'ils soient nécessaires pour m'aider à résoudre le problème de réinitialisation de la connexion.

2) Le premier client que j'ai créé a utilisé l'API SAAJ. 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) La prochaine version de mon client utilise 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'ai un client de test similaire 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 clients de test, j'ai également essayé de soumettre diverses demandes en utilisant SOAP UI. Fait intéressant, je ne pouvais pas charger le wsdl à partir de l'url, j'ai donc enregistré le code source de wsdl dans un fichier local et utilisé.

Voici la requête générée par Soap UI à 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 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)

Voici la trace complète 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)

D'après toutes mes recherches au cours des deux derniers jours, ce que j'ai déterminé, c'est que cette erreur est le plus souvent causée par la fermeture de la connexion par le serveur avant que le client ait fini de la lire.

Au début, je pensais qu'il y avait un problème avec le service Web lui-même, mais comme je suis capable d'exécuter la commande foxpro et d'obtenir une réponse valide, cela ne peut pas être le cas.

J'ai également essayé de modifier de nombreuses préférences dans les paramètres de l'interface utilisateur Soap, notamment le délai d'expiration du socket.

De plus, mes demandes ne passent pas par un serveur proxy.

Toutes suggestions ou conseils seront grandement appréciés! Je vous remercie.


MISE À JOUR POST SUIT


Voici la capture de Wireshark, simples ACK 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

Ensuite, la série de messages se répète.

Je pense donc que cela montre qu'il y a d'abord eu une demande de connexion faite par le client, qui a été reconnue par le serveur. Ensuite, il y a eu Client Hello, Server Hello, Handshake Protocol Certificate, Server Hello Done, Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message et enfin la connexion Reset (RST) du serveur.

J'ai recherché ce que les informations d'experts sur la dernière trame signifient, et il semble que cela pourrait signifier une séquence de protocole suspecte, par exemple la séquence n'était pas continue ou une retransmission a été détectée ...

Cela me fait encore me gratter la tête! Je ne comprends pas ce que je peux faire dans mon code ou dans l'interface utilisateur de Soap qui pourrait entraîner la réinitialisation de cette connexion à partir du serveur. Et pourquoi cela ne se produit pas à partir du message Microsoft.XMLHTTP dans le code foxpro ... Se pourrait-il que ma demande soit envoyée sous forme de fragments et que le serveur n'accepte pas cela?

Je pense que je vais essayer d'exécuter une capture Wireshark tout en exécutant la commande foxpro, mais c'est sur un PC avec Windows 8, donc je dois d'abord comprendre comment l'exécuter sous admin. Le client de test Java Java que j'exécute et qui obtient une réinitialisation de connexion est sur mon mac.

En attendant, quelqu'un a-t-il d'autres informations?

13
s_urbuteit

Comme je peux le voir, tous vos exemples devraient fonctionner correctement.

Je vous recommande d'utiliser un logiciel de traçage de paquets, tel que wirehark ou fiddler, et de vérifier les en-têtes de demande/réponse. Peut-être qu'il y a des informations supplémentaires (UserAgent, etc.) que vous devez définir sur la connexion avant de demander OutputStream

================ MISE À JOUR ======================

Comme vous l'avez spécifié, le serveur vous oblige à activer SSLv3. Utilisez-le avant d'établir la connexion

System.setProperty("https.protocols", "SSLv3");

J'ai fait cela dans mon test, et il semblait se connecter car je pouvais écrire le message soap sur OutputStream, mais j'ai eu une erreur 500 du serveur, ce qui est une bonne chose car c'est une erreur interne de werbservice

Maintenant, vous devez trouver ce qui ne va pas dans le message soap ou les données du message

================ MISE À JOUR 2 ======================

Fixé!

Pour clarifier, j'utilise le test numéro 4 (HttpUrlConnection)

Il y a un espace manquant à la fin de la 3ème ligne du message

"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +

devrait être

"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +

cause est contaténée avec xmlns:xsd définition.

J'ai cette réponse

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
        <getDailyReceiptsResponse xmlns="http://api.outdoorlicensesolution.com/RLIS/">
            <getDailyReceiptsResult>
                <Receipt>
                    <OrderID>0</OrderID>
                    <TotalSaleAmount>0</TotalSaleAmount>
                    <TaxCollectorFees>0</TaxCollectorFees>
                    <OrderDate>0001-01-01T00:00:00</OrderDate>
                    <AmountToACH>0</AmountToACH>
                    <CustomerID>0</CustomerID>
                    <ErrorMessage>Invalid Logon Credentials</ErrorMessage>
                </Receipt>
            </getDailyReceiptsResult>
        </getDailyReceiptsResponse>
    </soap:Body>
</soap:Envelope>
9
Cristian Meneses