0

私はJavaソケットを介して手動でsoap接続を開発しました(これは非常に単純なsoapリクエストであり、Axisは多くのビルドの問題を引き起こしていました)。

これを実現するために、基本的に、Soap UIから取得したHTTPヘッダーをコピーし、次のようにコーディングしました。

String hostname = "aaaaa";
int port = 11111;
InetAddress  addr = InetAddress.getByName(hostname);
Socket sock = new Socket(addr, port);
sock.setSoTimeout(100000);
BufferedWriter  wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
wr.write("POST " + "http://aaaa:11111/servicePath" + " HTTP/1.1\r\n");
wr.write("Host: aaaaa:11111\r\n");
wr.write("Accept-Encoding: gzip,deflate\r\n");
wr.write("Content-Length: " + soapXml.length() + "\r\n");
wr.write("Content-Type: text/xml; charset=\"UTF-8\"\r\n");
//wr.write("Connection: Keep-Alive\r\n");
wr.write("SOAPAction: \"/someSoapAction\"\r\n");
wr.write("User-Agent: Apache-HttpClient/4.1.1 (java 1.5)\r\n");
wr.write("\r\n");
wr.write(soapXml);
wr.flush();

リクエストは成功しました。つまり、サービスから期待するレスポンスを得ることができます。たとえば、手書きの「soapXml」にいくつかの無効なパラメータを入力すると、問題を説明するXMLで500エラーが返されます。すべてを正しく設定すると、ヘッダーに続くxml本文で200OKになります。

問題は、200OKの場合、HTTPボディを読み取る前にソケットが60秒ハングすることです。

基本的に、ヘッダー全体を読み取り、60秒待機してから、(一部のプロトコルがタイムアウトし、)最後にxml本体を読み取ります。

応答を読み取るためのコードは次のとおりです。

String line;
BufferedReader rd = new BufferedReader(new java.io.InputStreamReader(sock.getInputStream(),"UTF-8"));
while ((line = rd.readLine()) != null) { 
            i++;
            LOG.debug("cycle: "+i+" -------- "+line);
                     //after printing the header, it hangs 60 seconds before printing the follwing XML  
            if ((line.length() >0) && (line.charAt(0) == '<'))
            {
                responseXML = line;
            }
}

次に、200OKヘッダーのサンプルを示します。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Content-Length: 1052
Date: Sun, 13 Jan 2013 08:33:45 GMT -- hanging 60 seconds here
-- blank line
<?xml version="1.0" encoding="UTF-8"?>................</SOAP-ENV:Envelope>

誰かがこれに直面したことがありますか?ソープUIを使用するとすぐに答えが提供されるため、これは明らかにサーバーの問題ではないことに注意してください。

ありがとうございました

4

2 に答える 2

0

サーバー環境の変更(新しいマシンが提供された)により、問題は解決しました。

200OK の応答時間も 1 秒未満になりました。

残念ながら、環境の技術スタックに関する詳細はありません。とにかく助けてくれてありがとう。

于 2013-01-17T06:44:32.370 に答える
0

サーバーは、明らかに 60 秒のタイムアウトの間、HTTP キープアライブのために接続を開いたままにしています。HTTP 1.0 に変更するか、返された Content-length ヘッダーに注意して、そのバイト数で読み取りを停止してください。

于 2013-01-13T11:56:42.343 に答える