use*_*322 0 compression netbeans web-services jax-ws
我在 Netbeans 7.1.2 中使用了 Web 服务客户端向导,但是当我尝试调用其中一个方法时,我收到以下错误:
javax.xml.ws.soap.SOAPFaultException:异常:未启用压缩,此 Web 服务期望客户端支持 GZIP、Deflate 压缩
生成的骨架文件很多,我无法弄清楚如何启用压缩。有人可以建议吗?
非常感谢
这里有四件事需要考虑。有请求和响应,有客户端和服务器。在谈论压缩时,重要的是要准确说明我们针对的是这些情况中的哪一种。我读到发帖者的问题是关于客户端的问题,因为服务器似乎已经在进行压缩。(事实上,它似乎要求客户端能够处理压缩)。
这里有一些背景知识:压缩提示是 HTTP 协议的标准部分。客户端将通过随请求发送适当的 HTTP 标头来向服务器表明它愿意接受压缩响应。同样,服务器将通过响应中的适当 HTTP 标头元素来指示它是否已发送压缩响应。客户端还可以发送压缩请求。
这些是相关的 HTTP 标头元素:
Content-encoding:如果设置了此项,则意味着“我正在向您发送一条编码(例如压缩)消息”。客户端(在请求上)和服务器(在响应上)都可以使用它。
Accept-encoding:如果设置了此项,则意味着“我可以理解这些类型的编码(例如压缩方法),因此请随意向我发送以该格式编码的数据”。
这两个标头元素的典型值是“gzip”,这是迄今为止 HTTP 服务器和 HTTP 客户端使用的最常见的压缩方法。还有“deflate”,但坚持使用“gzip”。
让我们从头开始:客户端向服务器的请求:
事实上,这种压缩的情况很少见。原因是客户端无法提前知道服务器是否可以理解压缩请求。所以一般最好不要尝试这样做。通常这不是问题,因为通常反应很大。如果绝对有必要压缩请求,那么您需要首先以某种方式查询服务器的功能,或者绝对确定它可以处理压缩的请求。
然后是更有趣的部分:服务器到客户端的响应。
首先,客户端需要告诉服务器他愿意接受压缩响应。这是根据要求完成的(呃!)。Metro 指南中解释了如何向 JAX-WS 出站请求添加 HTTP 标头元素的一般方法。所以你会这样做:
SomeWebService someWS = service.getMyWebServicePort();
((BindingProvider)someWS).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS,
Collections.singletonMap("Accept-Encoding",Collections.singletonList("gzip")));
Run Code Online (Sandbox Code Playgroud)
您可能会说:“这不会替换所有HTTP 标头元素并将其替换为单个元素标头吗?”。从技术上讲是正确的,但此时 JAX-WS 尚未添加任何 HTTP 标头。JAX-WS 稍后将添加自己的标头元素。如果您监视服务器接收到的 HTTP 标头,您现在将看到如下内容:
内容类型:text/xml;charset="utf-8" 接受编码:gzip 肥皂行动:“http://blahblah” 接受:文本/xml、多部分/相关、文本/html、图像/gif、图像/jpeg、*;q=.2,*/*;q=.2 用户代理:JAX-WS RI 2.1.5-hudson-$BUILD_NUMBER- 主机:本地主机:8084 连接:保持活动状态 内容长度:216
如果没有我们明确的操作,“accept-encoding”元素就不会存在。(好问题为什么 JAX-WS 默认不添加这个??)
现在您已经完成了客户端的工作。上一张海报已经解释了如何在服务器端添加压缩能力。需要注意的是,服务器端的压缩(只要我们谈论压缩响应)仅由容器(例如 Tomcat、Glassfish、JBoss 等)处理,而不是由您的代码处理。您只需打开容器配置中的开关即可。
快完成了。服务器现在可以自由地向您的客户端发送 gzip 压缩响应,但由服务器自行决定。服务器可能会这样做,也可能不会。你不知道这一点。
您的最后一个问题应该是:“我如何在 JAX-WS 客户端中处理压缩响应?” 或者更广泛地说“我的 JAX-WS 客户端如何处理压缩响应和未压缩响应?”。好消息是这由 JAX-WS 透明地处理。你不需要做任何事。JAX-WS 将自动检测到它从服务器接收到压缩响应(它只是查看响应中的 HTTP 标头),并自动为您解压缩。瞧!
所以,亲爱的发帖人,我想说,如果您使用的是最新版本的 JAX-WS,您的客户端现在很可能已经知道如何处理压缩响应。然而,由于客户端没有明确告诉服务器它可以理解压缩响应,因此服务器认为情况并非如此,因此会给出该错误。这是我对你所看到的的猜测。
哦,还有一件事。根据 RFC 2616,HTTP 标头元素名称(它们正确地称为“标头字段”)不区分大小写。因此,您会在不同的帖子中看到这种拼写方式有很多不同。