2011-09-17 10 views
3

基本的にJAXWSを使用してWebサービスを作成しました。それはSOAPを使用し、動作します。しかし、一部のリクエストでクラッシュ/エラーが発生した場合、JAXWS Webサービスがコンテンツ長ヘッダーを送信しないという事実にリンクしているようです。それを追加する方法はありますか?JAXWSがSOAP応答でコンテンツ長ヘッダを送信する方法

使用:OpenJDKの-6は、(6b20)

私のクラスには、次のようになります。tcpdumpのを使用して

import javax.jws.WebService; 
import javax.jws.soap.SOAPBinding; 
import javax.jws.soap.SOAPBinding.Style; 
import javax.xml.ws.Endpoint; 

@WebService 
public class SOAP { 
public static void main(String[] args) { 
    try { 
     SOAP server = new SOAP(); 
     Endpoint endpoint = Endpoint.publish('localhost:1234', server); 
    } catch (Exception e) { 
       Utils.getLog("SOAP").fatal("General Error", e); 
    } 
} 
} 

は、応答には、コンテンツの長さがありません確認:だから

0x0000: 4500 00b0 4da5 4000 4006 20d5 5cf3 1021 [email protected]@...\..! 
0x0010: 5cf3 01c7 13b2 bcea a9be 716e 14c3 16a1 \.........qn.... 
0x0020: 8018 006c cc70 0000 0101 080a 2e1b 3ccc ...l.p........<. 
0x0030: 2e18 23a2 4854 5450 2f31 2e31 2032 3030 ..#.HTTP/1.1.200 
0x0040: 204f 4b0d 0a54 7261 6e73 6665 722d 656e .OK..Transfer-en 
0x0050: 636f 6469 6e67 3a20 6368 756e 6b65 640d coding:.chunked. 
0x0060: 0a43 6f6e 7465 6e74 2d74 7970 653a 2074 .Content-type:.t 
0x0070: 6578 742f 786d 6c3b 6368 6172 7365 743d ext/xml;charset= 
0x0080: 2275 7466 2d38 220d 0a44 6174 653a 2053 "utf-8"..Date:.S 
0x0090: 6174 2c20 3137 2053 6570 2032 3031 3120 at,.17.Sep.2011. 
0x00a0: 3134 3a31 393a 3337 2047 4d54 0d0a 0d0a 14:19:37.GMT.... 

私の質問は、応答と一緒にコンテンツの長さを送信するwebserviceに指示する方法はありますか?または返信が送信される前にそれを追加する方法?

+1

「転送符号化チャンク」は、「コンテンツ長」ヘッダを持たない。 http://en.wikipedia.org/wiki/Chunked_transfer_encoding - 私はあなたの問題が他の場所にあると考えています。 –

+0

良い点...すべてのデータが送信されたにもかかわらず、一部の要求が「完了」していないように見える理由を調べる時間。 – Neck

+0

なぜクライアントに問題があるのだろうか。すべてのHTTP/1.1クライアントは転送エンコードをサポートする必要があります。チャンク化されていて、コンテンツの長さを必要としません。クライアントがこれをサポートしていない場合、そのクライアントはHTTP/1.0を使用する必要があります –

答えて

3

送信応答にHTTPヘッダーを追加するには、ハンドラーを作成します。ハンドラは標準JAX-WS handlerを拡張し、handleMessage(Cコンテキスト)メソッドのMessageContextを使用してHTTP_RESPONSE_HEADERプロパティ(実際にはマップ内のキー)を変更します。だから、例えば、あなたのハンドラは次のようになります。

public class MyHandler<SOAPMessageContext> implements Handler { 

    public boolean handleMessage(SOAPMessageContext c) { 
     if((Boolean)c.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) { 
      c.put(SOAPMessageContext.HTTP_RESPONSE_HEADERS,"your header stuff here"); 
      return true; 
     } 
    } 
} 

あなたは、ハンドラチェーンのファイルを作成して、エンドポイントクラスでそのファイルを指して注釈を追加する必要があります。アノテーションは@HandlerChain(file = "...")です。

これを実行したら、inとoutboundでHTTPヘッダーを変更できるはずです。 HTH。

0

私は、プロバイダがチャンクメッセージを受け付けないという同様の問題を抱えていました。ヘッダー内のContent-Lengthも設定されず、実際にメッセージがチャンクされ、Webサービスプロバイダは私の呼び出しを拒否します。これはJAX-WSをAxis2 1.6と一緒にJAX-WSランタイムとして使用していました。

Content-lengthを手動で追加するためにHTTPヘッダーを追加しようとしましたが、これは他の問題を引き起こします。私は最終的には、HandlerのSOAPMessageContextに対してHTTPConstants.CHUNKEDをfalseに設定して動作させました。

私はおよそここにブログ:http://btarlton.blogspot.com/2013/03/jax-ws-with-axis2-how-to-disable.html#!/2013/03/jax-ws-with-axis2-how-to-disable.html

をAxis2のではJAX-WSランタイムとして、これは私が見つけることができる唯一の修正でした。

+0

この回答にリンクの主要部分を追加する必要があります。後であなたのブログがダウンした場合、この方法では、 – SztupY

関連する問題