什么是Silverlight中添加压缩到WCF最简单的方法?(What is the easiest

2019-06-23 09:06发布

我有一个访问WCF web服务的Silverlight 2 Beta 2的应用。 正因为如此,它目前只能使用basicHttp结合。 该Web服务将返回相当大量的XML数据。 这似乎从一个带宽使用率的角度来看相当浪费作为响应,如拉链,将是5倍小(其实我粘贴的响应转换成txt文件,并拉上了。)。

请求确有“接受编码:gzip,紧缩” - 有什么办法有WCF服务的gzip(或者压缩)的反应如何?

我也发现这个链接 ,但它肯定似乎是一个功能有点复杂应处理外的现成恕我直言。

行 - 起初我打上使用System.IO.Compression作为答案,因为我永远无法“似乎”让IIS7的动态压缩工作的解决方案。 好吧,事实证明:

  1. 在IIS7动态压缩沿着工作人。 这只是Nikhil的IE浏览器的Web开发助手插件并没有表现出来的工作。 我的猜测是,由于SL手中的Web服务调用关闭浏览器,该浏览器处理它“在幕后”和Nikhil的工具,从来没有看到压缩的响应。 我能够通过使用招其监控流量外部浏览器应用程序,以确认这一点。 在小提琴手的响应,事实上,gzip压缩!

  2. 另一个问题与System.IO.Compression解决方案是System.IO.Compression不Silverlight的CLR存在。

所以从我的角度来看,最简单的方法,以使在Silverlight WCF压缩是为了让IIS7中动态压缩,并在所有写任何代码。

Answer 1:

如果你正在使用IIS7,看看在压缩模块 。 这允许您为HTTP请求到服务器配置压缩。



Answer 2:

WS-压缩为WCF允许您在绑定配置压缩。

见WS-压缩为WCF巴勃罗·M. Cibraro

或者,尝试微软的GZip编码器的采样其中“创建一个使用System.IO.Compression.GZipStream类来压缩输出WCF消息的编码器的信道”



Answer 3:

我没有看到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;
    }
}

然后我只是我的服务采取的字节数组作为输入,像这样的

void ReceiveData(byte[] data);

制定了适合我。



Answer 4:

还应该注意的是,你可能需要的MIME类型添加到applicationHost.config<httpCompression><dynamicTypes>除了部分使压缩的网站:

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

如果某些动态响应不被压缩(有的),它可能是一个MIME类型的问题。 使用Fiddler获得与请求相关的细节。 失败请求跟踪可以是决定IIS是否被甚至试图压缩响应是有用的。 如果压缩配置正确,你会看到一个NO_MATCHING_CONTENT_TYPE在跟踪输出的完整的曲线部分。



文章来源: What is the easiest way to add compression to WCF in Silverlight?