web-dev-qa-db-ja.com

Java.net.SocketException:SOAP UIおよびJava client?

視覚的なfoxproアプリケーションをJava Webアプリケーションに変換しています。1つの小さな、しかし重要なアプリケーションがWebサービスにSOAPリクエストを送信します。

このWebサービスを呼び出す3つのテストクライアントを記述し、SOAP UIを使用してテストしました。このWebサービスに対するテストのたびに、Java.net.SocketException:Connectionが返されます。だから、明らかに、すべてのテスト方法で同じことを見逃しているか、同じことを間違っている。

Foxproコードがあり、foxpro経由でリクエストを正常に送信し、有効な応答を受け取りました。しかし、私はFoxproの経験がまったくないため、動作するfoxproのコードとJavaで記述している新しいコードの違いに苦労しています。

SoapやWebサービスの経験が豊富な人が私のコードを見て、自分で試してみて、問題が何であるかを理解できるようになることを望んでいます。

WebサービスのURLとすべてのコードを提供します。また、動作するfoxproコマンドラインコードも提供します。

FoxproコードはCreateObject("Microsoft.XMLHTTP")を使用します。これはASP、VB.net、およびC#でも使用されていることを研究で学びました。

1)ここに私が呼び出す必要があるWebサービスがあります:

ホスト: https://rlisapi.myfwc.com/

石鹸のエンドポイント:https://rlisapi.myfwc.com/wsReceipts.asmx

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

このWebサービスにはws-securityは含まれていません。資格情報はリクエスト自体に含まれています。もちろん、それらを提供することはできませんが、接続リセットの問題を解決するためにそれらが必要だとは思いません。

2)最初に作成したクライアントはSAAJ APIを使用しました。ここに私のコードがあります:

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)クライアントの次のバージョンはSocketと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)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... 
                } 

            }   
        }
    }
}

最後に、これらすべてのテストクライアントに加えて、SOAP UIを使用してさまざまなリクエストを送信しようとしました。興味深いことに、wsdlをURLからロードできなかったため、wsdlソースコードをローカルファイルとそれを使用しました。

Soap UIが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:

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

動作するFoxproコードも提供します。

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

エラーの完全なスタックトレースは次のとおりです。

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)

過去数日間の私のすべての調査から、このエラーは、ほとんどの場合、クライアントが読み取りを完了する前にサーバーが接続を閉じたことが原因であると判断しました。

最初はWebサービス自体に何か問題があると思っていましたが、foxproコマンドを実行して有効な応答を取得できるため、そうではありません。

ソケットタイムアウトを含むSoap UI設定の多くの設定も変更してみました。

また、私の要求はプロキシサーバーを経由しません。

提案やアドバイスは大歓迎です!ありがとうございました。


更新POSTフォロー


以下はWiresharkからのキャプチャで、単純なACKは省略されています。

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

その後、一連のメッセージが繰り返されます。

したがって、これが示しているのは、最初にクライアントからの接続要求があり、それがサーバーによって確認されたことだと思います。次に、クライアントHello、サーバーHello、ハンドシェイクプロトコル証明書、サーバーHello Done、クライアントキー交換、暗号仕様の変更、暗号化されたハンドシェイクメッセージ、そして最後にサーバーからの接続リセット(RST)がありました。

最後のフレームのExpert Infoの意味を調べたところ、プロトコルシーケンスが疑わしい、たとえばシーケンスが連続していないか、再送信が検出されました...

これでも頭が痛いです!私は自分のコードで何をしているのか、またはサーバーからこの接続がリセットされる可能性のあるSoap UIの内容を理解していません。そして、なぜfoxproコードのMicrosoft.XMLHTTP投稿から起こらないのでしょうか...リクエストがフラグメントとして送信され、サーバーがそれを受け入れないのでしょうか?

Foxproコマンドの実行中にwiresharkキャプチャを実行しようとすると思いますが、これはWindows 8を搭載したPC上で実行されるため、まずadminで実行する方法を理解する必要があります。 Java接続リセットを取得する実行中のテストクライアントは、私のMacにあります。

それまでの間、誰か他に洞察がありますか?

13
s_urbuteit

ご覧のとおり、すべての例が適切に機能するはずです。

Wiresharkやfiddlerなどのパケットトレースソフトウェアを使用して、リクエスト/レスポンスヘッダーを確認することをお勧めします。 OutputStreamを要求する前に接続で設定する必要がある追加情報(UserAgentなど)があるかもしれません

================ UPDATE ======================

指定したとおり、サーバーではSSLv3を有効にする必要があります。接続を確立する前にこれを使用してください

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

テストでこれを行い、SOAPメッセージをOutputStreamに書き込むことができたので接続しているように見えましたが、サーバーから500エラーが発生しましたが、これはwerbserviceの内部障害なので良いことです

次に、SOAPメッセージまたはメッセージデータの何が問題であるかを見つける必要があります。

================ UPDATE 2 ======================

修繕!

明確にするために、テスト番号4HttpUrlConnection)を使用しています

メッセージの3行目の終わりにスペースがありません

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

あるべき

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

原因はxmlns:xsd定義で汚染されます。

私はこの応答を得ました

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