在传输层上压缩WebService的请求和响应

您现在的位置:诗歌鉴赏 > 儿童文学 58浏览

	在传输层上压缩WebService的请求和响应

场景是这样的:客户端.应用程序,WCF实现WebService调用,服务端Java,通过CXF提供WebService。 有一个方法提供了有一个字符串类型的参数,实际生产环境里会传100k以上的字符串。 在并发量比较大的情况下,带宽占用很严重。

所以寻找一种可以把传输的SOAP消息在客户端压缩,服务端解压缩的方法。 这里提供的方式在是客户端通过WCF的MessageEncoder机制对所有的SOAP请求消息压缩,SOAP响应消息解压缩,反过来在服务端通过一个Filter对所有的SOAP请求消息,对SOAP响应消息压缩。 请求的流程如下:Client-SOAPRequest-GzipMessageEncoder-gzipbinary-GzipWebSericeFilter-SOAPRequest-CXF响应的流程如下:CXF-SOAPResponse-GzipWebServiceFilter-gzipbinary-GzipMessageEncoder-SOAPResponse-Client其中.NET的WCF的GzipMessageEncoder是参照,下载解压后路径WF_WCF_Samples\WCF\Extensibility\MessageEncoder\Compression下面先来看一下客户端部分的代码:这文件主要是提供GZipMessageEncoder,在里面通过重写ReadMessage和WriteMessage方法来实现压缩和解压缩。

实际压缩和解压处理是使用GZipStream实现的。 下面是这里的GZipMessageEncodingBindingElement类是为了在里添加配置项。

然后我们就可以把这个GZipMessageEncodingElement配置到里了客户端最后的部分就是调用webservice,这里的压缩和解压对于调用者和陪调用者是透明的。 也就是同没有压缩和解压之前的使用方法一样。 服务端是一个Filter,和HttpServletRequest和HttpServletResponse的包装类。 入口:这里就是判断contentType,如果是gzip的就用GzipHttpServletRequestWrapper和GzipHttpServletResponseWrapper包装原始的Request和Response以实现压缩和解压缩。 GzipHttpServletRequestWrapperGzipHttpServletResponseWrapper这里做的主要事情就是在Resquest的getInputStream和Response的getOutputStream是返回一个拥有GZip功能的Stream,来代替原始的Stream。

通过原始的Stream仍然是最终的输入和输出源。 然后在中把这个Filter作用于原来的WebService的的配置和cxf原来的一样如果你想看一下实际的HTTP请求和响应是什么样子的可以用FiddlerWebDebugger来查看本文的源代码在附件中。 本文的方案没有在最终的被用于生产环境,一个原因是比较复杂,另外一个是服务器在对大XML进行unmarshal的效率并不高。 单本文的方案的好处就是不用对原有的webservice接口和实现进行修改。 最后在实际场景用我们使用来解决问题的,后面我还会写一篇文章来介绍这个方法。