繁体   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