我有一个访问WCF Web服务的silverlight 2 beta 2应用程序.因此,它目前只能使用basicHttp绑定.Web服务将返回相当大量的XML数据.从带宽使用的角度来看,这看起来相当浪费,因为如果压缩,响应会小5倍(我实际上将响应粘贴到txt文件中并压缩它.).
请求确实有"Accept-Encoding:gzip,deflate" - 有没有办法让WCF服务gzip(或以其他方式压缩)响应?
我确实找到了这个链接,但它确实看起来有点复杂的功能应该是开箱即用的恕我直言.
好的 - 首先我使用System.IO.Compression作为答案标记了解决方案,因为我无法"看起来"让IIS7动态压缩工作.事实证明:
在IIS7动态压缩是一起工作的人.只是Nikhil的IE开发人员Helper插件没有显示它的工作原理.我的猜测是,由于SL将Web服务调用关闭到浏览器,浏览器"在幕后"处理它,而Nikhil的工具永远不会看到压缩响应.我能够通过使用Fiddler来确认这一点,Fiddler监视浏览器应用程序外部的流量.事实上,在提琴手中,响应是gzip压缩的!
System.IO.Compression解决方案的另一个问题是Silverlight CLR中不存在System.IO.Compression.
因此,从我的角度来看,在Silverlight中启用WCF压缩的EASIEST方法是在IIS7中启用动态压缩并且根本不编写任何代码.
WCF的WS-Compression允许您配置绑定的压缩.
请参阅Pablo M. Cibraro的WCF的WS-Compression
或者,尝试使用Microsofts GZip Encoder Sample "创建一个使用System.IO.Compression.GZipStream类来压缩传出WCF消息的编码器通道"
我最近在做WCF项目时没有看到WCF进行压缩的原生方式.我刚刚使用了System.IO.Compression命名空间并制作了一个快速压缩器.这是我使用的代码
public static class CompressedSerializer { ////// Decompresses the specified compressed data. /// ////// The compressed data. /// public static T Decompress (byte[] compressedData) where T : class { T result = null; using (MemoryStream memory = new MemoryStream()) { memory.Write(compressedData, 0, compressedData.Length); memory.Position = 0L; using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true)) { zip.Flush(); var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); result = formatter.Deserialize(zip) as T; } } return result; } /// /// Compresses the specified data. /// ////// The data. /// public static byte[] Compress (T data) { byte[] result = null; using (MemoryStream memory = new MemoryStream()) { using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true)) { var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); formatter.Serialize(zip, data); } result = memory.ToArray(); } return result; } }
然后我就让我的服务接受一个字节数组作为输入,就像这样
void ReceiveData(byte[] data);
为我做得很好.
如果您使用的是IIS7,请查看压缩模块.这允许您为服务器的HTTP请求配置压缩.