在Silverlight中向WCF添加压缩的最简单方法是什么?

在Silverlight中向WCF添加压缩的最简单方法是什么?,wcf,silverlight,compression,gzip,Wcf,Silverlight,Compression,Gzip,我有一个silverlight 2 beta 2应用程序,可以访问WCF web服务。因此,它目前只能使用basicHttp绑定。Web服务将返回相当大量的XML数据。从带宽使用的角度来看,这似乎是相当浪费的,因为响应如果压缩,会小5倍(实际上我将响应粘贴到一个txt文件中并压缩) 请求确实有“Accept Encoding:gzip,deflate”-WCF服务gzip(或压缩)响应有什么方法吗 我确实发现了这一点,但对于应该开箱即用的IMHO来说,这似乎有点复杂 好的-首先,我用System

我有一个silverlight 2 beta 2应用程序,可以访问WCF web服务。因此,它目前只能使用basicHttp绑定。Web服务将返回相当大量的XML数据。从带宽使用的角度来看,这似乎是相当浪费的,因为响应如果压缩,会小5倍(实际上我将响应粘贴到一个txt文件中并压缩)

请求确实有“Accept Encoding:gzip,deflate”-WCF服务gzip(或压缩)响应有什么方法吗

我确实发现了这一点,但对于应该开箱即用的IMHO来说,这似乎有点复杂

好的-首先,我用System.IO.Compression作为答案标记解决方案,因为我“似乎”永远无法让IIS7动态压缩工作。事实证明:

  • IIS7上的动态压缩沿着工作方向进行。只是Nikhil的IE Web Developer Helper插件没有显示出它的工作原理。我的猜测是,由于SL将web服务调用交给了浏览器,因此浏览器“在幕后”处理它,Nikhil的工具从未看到压缩响应。我可以通过使用Fiddler来确认这一点,它监视浏览器应用程序外部的流量。在fiddler中,响应实际上是gzip压缩的

  • System.IO.Compression解决方案的另一个问题是,Silverlight CLR中不存在System.IO.Compression


  • 因此,从我的角度来看,在Silverlight中启用WCF压缩的最简单方法是在IIS7中启用动态压缩,而不编写任何代码。

    最近在执行WCF项目时,我没有看到WCF进行压缩的本机方法。我只是使用了System.IO.Compression名称空间并制作了一个快速压缩器。这是我使用的代码

    public static class CompressedSerializer
    {
        /// <summary>
        /// Decompresses the specified compressed data.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="compressedData">The compressed data.</param>
        /// <returns></returns>
        public static T Decompress<T>(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;
        }
    
        /// <summary>
        /// Compresses the specified data.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data">The data.</param>
        /// <returns></returns>
        public static byte[] Compress<T>(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;
        }
    }
    

    对我来说很好

    如果您正在使用IIS7,请查看。这允许您为发送到服务器的HTTP请求配置压缩。

    WS-compression for WCF允许您在绑定上配置压缩

    见Pablo M.Cibraro


    或者,尝试Microsofts,它“创建一个使用System.IO.Compression.Gzip流类压缩传出WCF消息的编码器通道”

    还应注意,除了为站点启用压缩之外,您可能还需要将mime类型添加到
    部分下的
    applicationHost.config

    <add mimeType="application/soap+msbin1" enabled="true" />
    
    
    

    如果某些动态响应没有被压缩(有些是),则可能是mime类型的问题。使用Fiddler获取与请求相关的细节。失败的请求跟踪可能有助于确定IIS是否正在尝试压缩响应。如果压缩配置正确,您将在跟踪输出的完整跟踪部分中看到一个
    无匹配内容类型

    一个警告是silverlight 2根本不支持WS绑定,只支持basicHttp绑定。这里有一些警告:我的工作代理删除accept gzip头(wtf,对吗?)。您只压缩发送到客户端的数据。请注意,在Silverlight 2 CLR中GZipStream不可用。DimeBrain在这里实现了SharpZipLib:这对我来说是成功的。但是,应该注意,您必须在C:\Windows\System32\inetsrv\config\applicationHost.config文件中设置此设置,因为web.config设置被忽略。动态压缩只适用于某些请求(即被IIS视为经常调用的请求)。所以这是一个很好的特性,但您无法控制它。当用户登录时,我有一个非常大的呼叫。但它每天都会发生一次。而且它没有被压缩。
    <add mimeType="application/soap+msbin1" enabled="true" />