我目前在嘗試為 CXF 啟用 GZIP 壓縮時遇到問題:WSDL 加載失敗,因為它被壓縮并且客戶端部分沒有解壓縮它。
這意味著比我執行以下操作時:
persistenceService = Service.create(
new URL(replaceHostAndPort(
getClientServiceConfiguration().getWsMetadataPersistenceService())),
new QName("http://metadata.ws.com", "WsMetadataPersistenceService"), gzipFeature);
mDefaultMetadataPersistence = persistenceService.getPort(IWsMetadataPersistence.class);
代碼在 Service.create() 上失敗,因此與配置 ClientProxy 無關。
據我在 CFX 的源代碼中所知,WSDL 的加載不使用我在引數中傳遞的特性,也沒有使用我使用以下配置在默認總線上傳遞的特性:
<bean id="compressGZIPFeature" class="org.apache.cxf.transport.common.gzip.GZIPFeature"/>
<cxf:bus>
<cxf:features>
<ref bean="compressGZIPFeature"/>
</cxf:features>
</cxf:bus>
注意:我可以在使用總線元素的 CXF 內部類使用的總線實體中看到,我的功能在那里并且已正確初始化(添加輸入/輸出攔截器),但是我在嘗試加載時從未傳遞過它們WSDL 檔案。
現在我有點卡住了:WSDL 一開始就不應該被壓縮嗎?那是怎么回事,還是我的問題出在客戶端?
在服務器端,我嘗試了各種我能找到的組合,希望只壓縮請求的內容而不是 WSDL,但無濟于事:
- @GZIP
- XML 總線配置
- @In/OutInterceptors
形成我對 CXF 客戶端代碼的理解,來自 HttpUrlConnection 的 InputStream 直接交給 XMLReader 以讀取 WSDL,而不使用攔截器(此外,GZIPInterceptor 忽略來自 GET 請求的訊息,因此它應該忽略 GET [ ...]?wsdl aniway. 如果要檢查代碼,請參閱 WSDLManagerImpl.loadDefinition()。
我不確定它是否相關,我正在采用 openjdk 8 和 cxf 3.1.7。
uj5u.com熱心網友回復:
我找到了解決方案:我在 HTTP Conduit 上添加了壓縮,這甚至會產生 GZIP 版本的 wsdl 請求請求。問題是 WSDL 閱讀器不處理接收到的 GZIP 流。
所以我不得不洗掉客戶端的壓縮配置并使用下面的代碼來確保只有 SOAP 請求會被壓縮:
public <T> T createAndConfigureService(Class<? extends T> theServiceClass, Service service){
T theWebService = service.getPort(theServiceClass);
Map<String, Object> requestHeaders = new HashMap<>();
requestHeaders.put("Accept-Encoding", new ArrayList<>(Arrays.asList("gzip")));
((BindingProvider)theWebService).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);
Client client = ClientProxy.getClient(theWebService);
client.getInInterceptors().add(new GZIPInInterceptor());
return theWebService;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/430755.html
