【问题标题】:IIS Compression vs manual GZIPIIS 压缩与手动 GZIP
【发布时间】:2010-11-02 15:27:21
【问题描述】:

我目前正在开发一个通过 WCF 服务传递一些地理数据的项目。这些数据的大小会增加(有时 2-4mb,在特殊情况下甚至更多)。为了帮助减少网络上的数据大小,我们最初在 IIS 上启用了 gzip 压缩(这很有效)。唉,在测试中,我们发现我们使用的代理之一使这变得毫无价值。

因此,我决定在数据发送出我们的服务之前对其进行压缩。我在 WCF 和我们的 Silverlight 客户端中都使用 SharpZipLib。它运行良好,将我们的数据从大约 2.9MB 缩小到大约 400KB,但是 IIS 压缩能够进一步降低数据。

现在我很好奇...

  1. IIS GZip 压缩背后有什么秘诀可以让它压缩得更好吗?

  2. 有没有更好的压缩算法可以使用?

【问题讨论】:

    标签: .net silverlight wcf gzip


    【解决方案1】:

    1) 是的,有一种秘方,但我不知道它是什么。

    但这是我真正想说的:

    2) 您希望获得更高的压缩率可能会降低您的网站速度。不要这样做。微优化在此级别没有帮助。

    【讨论】:

    • 我不同意:如果传输时间是客户端等待时间的大部分(并且很可能是 4mb 有效负载),那么这根本不是微优化。虽然寻找增量方式进行此传输可能会更好,但快速修复更改压缩方案可能会节省数周的重新设计时间,从而使应用程序进行部分传输和更新。
    • 我会尊重您的专业知识。但是,通过将压缩级别设置得更高,我们并没有看到太大的改进,这仅仅是因为正如您所指出的,并不是整个有效负载都被压缩了。我看不到花更多时间进一步压缩数据的好处。当然,我是根据我们自己的经验说的,但这只是一个网站。
    【解决方案2】:

    背后有什么秘诀吗 IIS GZip 压缩使得它 压缩得更好?

    在 SharpZipLib 中,您可以使用 SetLevel(9)(使用 zip 时)设置为最大压缩。但是,您必须记住,当您通过 IIS 进行压缩时,整个有效负载都会被压缩,而当您自己进行压缩时,它只是有效负载的一部分。所以 IIS 总是能够稍微压缩更多。

    有没有更好的压缩算法可以使用?

    通过 IIS,并非如此。通过 HTTP 可用的压缩方法只有这么多:http://en.wikipedia.org/wiki/HTTP_compression

    使用自定义压缩,您可以尝试 7zip、lzh 等 - 任何您可以找到库或自己编写的东西。很大程度上取决于您要归档的内容,因为不同的有效负载的压缩方式不同。我会立即尝试使用sharpziplib 内置的那些(bzip2)。我也试试7zip (possible with c#)

    【讨论】:

    • 我们正在考虑删除 http 压缩,因为它在一半情况下都不起作用(代理解压缩它并且无法重新压缩。)我们已经与支持团队合作,但他们无法在这种情况下通过 http 压缩来帮助,因此现在的目标是手动完成。我为 Gzip 设置了 SetLevel(9),但没有太大改进。 Zip 的反应更好吗?
    【解决方案3】:

    我玩弄了各种按压方式,然后我就恍然大悟了。 WCF 终结点设置为使用 binaryEncoding。这意味着 IIS 将采用二进制编码数据并对其应用压缩。

    在我的例子中,我使用标准 DataContractSerializer 和 MemoryStream 对数据进行了序列化。然而,这会吐出 XML。

    我们找到的最佳解决方案是在我的 DataContractSerializer 中使用 BinaryDictionaryWriter。这为我提供了二进制编码数据,然后我可以使用 GZIP 对其进行压缩。最终结果的压缩效果比我们使用 IIS 得到的要好。 (通过 IIS 到 700K 到 500K 使用这种方法)

    您可以在以下帖子中看到如何使用 BinaryDictionaryWriter 的示例。这是批准答案下方的答案。 How to transfer large amount of data using WCF?

    现在要看看从端点中删除二进制编码的效果,看看这种性能是否值得额外的“东西”层。

    【讨论】: