簡體   English   中英

JAX-WS Netbeans如何啟用壓縮Web服務客戶端

[英]JAX-WS Netbeans how to enable compression web service client

我在Netbeans 7.1.2中使用了Web服務客戶端向導,但是當我嘗試調用一種方法時,我收到以下錯誤:

javax.xml.ws.soap.SOAPFaultException:異常:壓縮未啟用,此Web服務期望客戶端支持GZIP,延遲壓縮

生成的框架文件很多,我無法確定如何啟用壓縮。 任何人都可以請教嗎?

非常感謝

這里有四件事要考慮。 有一個請求和一個響應 ,有一個客戶端服務器 在討論壓縮時,准確確定我們要針對的是哪種情況很重要。 我讀到發布者的問題是關於客戶端的問題,因為服務器似乎已經在進行壓縮。 (實際上,它似乎要求客戶端能夠處理壓縮)。

這里有一些背景知識:壓縮提示是HTTP協議的標准部分。 客戶端將通過與請求一起發送適當的HTTP標頭,向服務器指示它願意接受壓縮的響應。 同樣,服務器將通過響應中的適當HTTP標頭元素來指示它是否發送了壓縮響應。 客戶端還可以發送壓縮的請求。

這些是相關的HTTP標頭元素:

  • Content-encoding :如果設置,則表示“我正在向您發送編碼(例如壓縮)消息”。 客戶端(在請求上)和服務器(在響應上)都可以使用它。

  • Accept-encoding :如果設置,則表示“我可以理解這些類型的編碼(例如壓縮方法),所以請隨時向我發送以該格式編碼的數據”。

這兩個標頭元素的典型值是“ gzip”,這是迄今為止HTTP服務器和HTTP客戶端使用的最常見的壓縮方法。 還有“放氣”,但堅持使用“ gzip”。

讓我們從頭開始:從客戶端到服務器的請求

實際上很少看到這種壓縮。 原因是客戶端無法提前知道服務器是否可以理解壓縮的請求。 因此,通常最好不要嘗試此操作。 通常,這不是問題,因為響應通常很大。 如果絕對有必要壓縮請求,那么您首先需要以某種方式查詢服務器的功能,或者絕對確保它可以處理壓縮的請求。

接下來是更有趣的部分:從服務器到客戶端的響應

首先,客戶端需要告訴服務器他願意接受壓縮的響應。 這是根據請求完成的(duh!)。 Metro指南在此處說明了如何向JAX-WS出站請求添加HTTP標頭元素的一般方法。 所以你會這樣:

SomeWebService someWS = service.getMyWebServicePort();
((BindingProvider)someWS).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS,
    Collections.singletonMap("Accept-Encoding",Collections.singletonList("gzip")));

您可能會說:“這是否將替換所有 HTTP標頭元素並將其替換為單個元素標頭?”。 從技術上講是正確的,但是此時JAX-WS尚未添加任何HTTP標頭。 JAX-WS稍后將添加其自己的標頭元素。 現在,如果監視服務器接收的HTTP標頭,您將看到類似以下內容:

content-type : text/xml;charset="utf-8"
accept-encoding : gzip
soapaction : "http://blahblah"
accept : text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
user-agent : JAX-WS RI 2.1.5-hudson-$BUILD_NUMBER-
host : localhost:8084
connection : keep-alive
content-length : 216

如果沒有我們的明確行動,“ accept-encoding”元素就不會存在。 (很好的問題,為什么JAX-WS默認不添加它??)

現在您已經完成了客​​戶端。 上一個海報說明了如何在服務器端添加壓縮功能。 需要注意的是,服務器端的壓縮(只要我們談論壓縮響應 )僅由容器(例如Tomcat,Glassfish,JBoss等)處理,而不是由代碼處理。 您只需要在容器的配置中翻轉一個開關即可。

快完成了 現在,服務器可以自由地向您的客戶端發送gzip壓縮的響應,但由服務器自行決定。 服務器可以執行或不執行。 你不知道

您的最后一個問題應該是:“我如何在我的JAX-WS客戶端中處理壓縮的響應?” 或更廣泛地說,“我的JAX-WS客戶端將如何處理壓縮響應與未壓縮響應?”。 好消息是,這是由JAX-WS透明處理的。 您什么都不需要做。 JAX-WS將自動檢測到它從服務器接收到壓縮的響應(它只是查看響應中的HTTP標頭),並將自動為您解壓縮。 瞧!

因此,親愛的發布者,我想說,很可能,如果您使用的是最新版本的JAX-WS,那么您的客戶端現在已經將如何處理壓縮響應。 但是,由於客戶端尚未明確告知服務器它可以理解壓縮的響應,因此服務器認為情況並非如此,因此會給您該錯誤。 那是我對您所看到的猜測。

哦,還有一件事。 根據RFC 2616,HTTP標頭元素名稱(它們正確地稱為“標頭字段”)不區分大小寫。因此,您會在不同的帖子中看到許多不同的拼寫方式。

您可以從應用程序服務器配置中更好地啟用壓縮。 從您的問題來看,您最有可能使用玻璃魚或雄貓(我更像是雄貓人)。 對於玻璃魚,可以通過將以下內容添加到domain.xml來啟用壓縮

         <property name="compression" value="on"/>

或者,如果您要通過管理控制台管理服務器,請使用此直觀指南 對於tomcat添加

         compression="on" 

server.xml配置文件中的tomcat <Connector/>元素。

要實際發送壓縮的JAX-WS請求,只需將壓縮標頭添加到HTTP有效負載中即可表明您打算發送壓縮的請求

    Map<String, List<String> theHeaders = new HashMap<String, List<String>>();
theHeaders.put("Content-Encoding", Collections.singletonList("gzip"));//this indicates you're sending a compressed request
theHeaders.put("Accept-Encoding", Collections.singletonList("gzip")); //this says you're willing to accept a compressed response
Map<String, Object> reqContext = ((bindingProvider) proxy)
        .getRequestContext(); //get access to the request context of your webservice request
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, httpHeaders);

通過設計,可以從Web服務處理程序更好地執行上述邏輯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM