2011-09-17 75 views
3

基本上我使用JAXWS做了一個Webservice。它使用SOAP並且工作。但是,在某些請求中某些客戶端崩潰/錯誤時,它似乎與JAXWS Web服務不發送內容長度頭的事實相關聯。有沒有辦法添加它?如何使JAXWS在SOAP響應上發送內容長度標題

使用:OpenJDK的-6(6b20)

我的類看起來是這樣的:

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); 
    } 
} 
} 

使用tcpdump的確認是沒有內容長度的響應:

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

所以我的問題是,有沒有辦法告訴web服務發送內容長度以及答覆?或者在發送回覆之前附加它的方式?

+1

'Transfer-encoding chunked'沒有'content-length'頭部。 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 =「...」);

一旦你這樣做了,你應該可以修改進出的HTTP標頭。 HTH。

0

我有一個類似的問題,即提供者不接受分塊的消息......它不會在頭中設置Content-length,並且實際上會將消息分塊並且Web服務提供者會拒絕我的呼叫。 。這是使用JAX-WS和Axis2 1.6作爲JAX-WS運行時。

我試着添加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