题
从之前关于尝试提高网站性能的帖子中,我一直在关注HTTP压缩。我已经阅读过有关在IIS中进行设置的内容,但它似乎对所有IIS应用程序池都是全局性的,因为还有另一个站点在运行,所以我可能不允许这样做。然后我看到一些代码放在global.asax中,以便在每个网站上实现相同的功能。
See Here http://www.stardeveloper.com/articles/display.html?article=2007110401&page= 1] 1
这和IIS中的设置一样好吗?效果有多大?任何已知的问题?
解决方案
如果你继续这样做,我建议实现一个HttpModule与global.asax。 HttpModule允许您通过配置更改与重建禁用压缩,并允许您将压缩程序集与Web应用程序分开。
Rich Crane在这里有一个相当不错的2.0模块: http://www.codeplex.com/httpcompression/ 如果你想快速起步和跑步。
史蒂文罗杰斯提到的 blowery 项目也是一个HttpModule。
否则,编写自己的内容非常简单。 HttpModule为您提供与global.asax相同的事件 - BeginRequest,EndRequest和更精细的事件,如PostReleaseRequestState和PreSendRequestHeaders,您可能需要消除所有皱纹。
就IIS压缩verus HttpModule而言,IIS肯定更容易,因为你不必为另一个程序集大惊小怪。我已经将这两种方法用于商业应用程序,并且两者都在负载测试下同等地执行。如果IIS可用,我会说使用它。
HTML,JS,CSS和XML文件的压缩率在60%到80%之间,与gzip相同。请记住,您的许多有效负载可能是图像和多媒体对象,这些对象更难以压缩。
其他提示
http://blowery.org/httpcompress/
我们已经在我的工作中使用了这个压缩实用程序一段时间了。非常好。
如果您位于共享托管环境中,我认为Global.asax选项会很好,例如,您无法访问IIS配置。
IIS 6提供了基本的压缩支持,但是如果你已经在IIS 7中,那么它为你提供了很好的 HTTP压缩支持,您可以根据配置文件中的MIME类型定义哪些文件被压缩...
它实现了与IIS压缩基本相同的功能 - 最终都通过gzip压缩发送响应。我最近实施了这种方法,它一直将响应大小减少了60%,没有值得担心的性能影响。
有一些可能的问题。首先,您需要注意输出缓存。您需要使用自定义VaryBy来确保为具有不同Accept-Encoding标头的请求缓存不同版本。否则,如果压缩版本被缓存,则所有用户都将收到它,无论他们的浏览器是否可以接受它。
其次,如果使用Response.End或Response.Flush,GZipStream有时会截断响应中的最后几个字符,因为直到太晚才关闭流。我不知道有什么好的解决方案。
最后,这只会压缩您的HTML。任何CSS或Javascript文件都将正常提供。例如,您需要通过自定义IHttpHandler提供这些文件来压缩它们。
JavaScript和VBScript存在问题。 JavaScript问题已在xxldaniel对编码错误文章的评论中得到确认,我使用类似JSON的“Scripting.Dictionary”与VBScript(用于M $ Office自动化)有问题。使用“Microsoft.XMLHTTP”请求。
您可以尝试 mod_gzip 模块。它使用托管ZLib版本,并允许高度可调配置。语法与同名的Apache模块兼容,甚至可以扩展。因此,例如,您可以为不同的mime类型设置不同的压缩级别,等等。