Spiga

利用.net2.0中的GZip或Deflate压缩文件

2007-12-07 10:33 by Dev.Hong, 4996 visits, 收藏, 编辑

在DotNet2.0中提供了GZip和Deflate压缩算法,而现在的浏览器几乎都支持 GZip 和 Deflate 压缩,因此在传输一些大的JS或CSS文件(如EXTJS)时对它进行压缩则可以减少下载时间,从而提高加载速度。

刚开始的解决方案是(参考网络上别人写的):


自定义一个 CompressionHttpHandler,实现 System.Web.IHttpHandler 接口,在 ProcessRequest 添加以下代码:
b.jpg
这样传输的内容就是经过GZip压缩的,到客户端时浏览器会自动将其解压。

但是这样做的效率不高,每次都需要在服务器端进行压缩,浪费了资源,所以我在这基础上改了一下,就是在本地将文件先进行压缩,然后设置 Content-encoding,这样便可减少浪费服务器很多资源。

20071211102758.jpg20071211102840.jpg



首先取得请求的路径,然后判断浏览器是否支持GZip压缩,如果支持,则设置Content-encoding为gzip,然后设置输出的压缩文件为采用GZip压缩的,最后将文件写入到context.Response中。
注:在这里我将采用GZip压缩的文件命名为 原文件 + .gz,Deflate则为 原文件 + .de,且压缩的文件和原文件必须在同一目录。

Web.Config中添加如下:
config.jpg

以引入一个ExtJS为例说说如何使用:
<script type="text/javascript" src="http://localhost/website1/Scripts/ext-all.js.c"></script>



这里提供一个简单的工具,用来压缩文件(采用GZIP和Deflate)
zip.jpg

先选择要压缩的原文件,然后点开始即可。

下面我们看看实际效果:
old1.jpg
这是采用了浏览器压缩的

new.jpg
这是未压缩的

对比一下可以看出效果还是不错的。

有需要的朋友可以点击此处下载本文代码

Add your comment

35 条回复

  1. #1楼 zzz[未注册用户]2007-12-07 10:52
    这个用web服务器来设置压缩效率高一些吧
     回复 引用   
  2. #2楼 瓜牛      2007-12-07 10:57
    不错,帮顶!
     回复 引用 查看   
  3. #3楼 随风飘扬[未注册用户]2007-12-07 11:07
    图片?防转载?

    博主有写错了,AddHeader中,gzip写成了zgip
     回复 引用   
  4. #4楼[楼主] t-mac.NET      2007-12-07 11:10
    @随风飘扬
    采用图片是方便一点,直接截下来,,,


    呵呵,笔误,谢谢提醒
     回复 引用 查看   
  5. #5楼 大石头      2007-12-07 11:38
    很妙,我下次也这么做
     回复 引用 查看   
  6. #6楼 A1[未注册用户]2007-12-07 11:39
    如果是自己的服务器,还是设置web服务器来实现比较好。IIS6里的gzip压缩比、效率都还挺高的,比zlib还强,只是字典是固定的,过小的文件压缩后有可能反倒更大。IIS 自带的压缩有个缺点就不能设置例外、动态压缩结果是否受缓存设置影响也不明确(这点可以向MS确认),但只要不是有特殊要求,需要压缩动态输出的情形也应该考虑使用,毕竟效率高得多。
     回复 引用   
  7. #7楼 AlphaWu      2007-12-07 11:44
    http://vsorcas.net.cn
    不错。。
     回复 引用 查看   
  8. #8楼 Jeffrey Zhao      2007-12-07 12:14
    @t-mac.NET
    @大石头
    搜索引擎搜不到了阿.
     回复 引用 查看   
  9. #9楼 Jeffrey Zhao      2007-12-07 12:15
    其实也就是类似静态化了.
     回复 引用 查看   
  10. #10楼[楼主] t-mac.NET      2007-12-07 13:04
    @Jeffrey Zhao

    我一般是用来装载过大的JS或CSS,跟搜索引擎没关系吧
     回复 引用 查看   
  11. #11楼[楼主] t-mac.NET      2007-12-07 13:06
    @A1
    用IIS是可以解决,但是这样子会增加服务端负担,并且不好控制,因为有些什么时候我不需要压缩全部,比如我只需要压缩过大的JS或CSS而已
     回复 引用 查看   
  12. #12楼 neoragex2002      2007-12-07 21:19
    有想法,8错! 其实还可以不局限于gzip,如果有性能更好的非对称压缩方式,估计更能体现这种方式的优势。
     回复 引用 查看   
  13. #13楼 Betree Xing      2007-12-07 23:24
    搜索引擎一般是支持GZip和Deflate的.

    --引用--------------------------------------------------
    Jeffrey Zhao: @t-mac.NET
    @大石头
    搜索引擎搜不到了阿.
    --------------------------------------------------------
     回复 引用 查看   
  14. #14楼 oxsoft.cn[未注册用户]2007-12-07 23:37
    楼主又冒泡了,支持一下
     回复 引用   
  15. #15楼[楼主] t-mac.NET      2007-12-08 08:45
    @neoragex2002
    需要浏览器的支持

    现在的浏览器一般都支持GZip和Deflate,,在这个解决方案中,如果浏览器都不支持这两种压缩,则返回未压缩的原文件
     回复 引用 查看   
  16. #16楼 muyurong[未注册用户]2007-12-08 20:36
    我在本地已经成功实现了,但是上传到服务器,没有实现解压的功能,到底要在服务器进行什么样的设置才可以呀
     回复 引用   
  17. #17楼 muyurong[未注册用户]2007-12-08 20:38
    我很需要这个功能,那位大哥帮忙解决一下
     回复 引用   
  18. #18楼 重典      2007-12-09 19:09
    我冲动了一下*.* 不过立刻Ajax就废了......光压JS效果还算不错...漂漂
     回复 引用 查看   
  19. #19楼[楼主] t-mac.NET      2007-12-10 08:56
    @muyurong
    在服务器并不需要做什么设置,,,,

    解压是在客户端进行的,,,


    建议用httpwatch跟踪一下
     回复 引用 查看   
  20. #20楼[楼主] t-mac.NET      2007-12-10 08:56
    @重典
    Ajax怎么就废了,能说清楚点吗?
     回复 引用 查看   
  21. #21楼 jnz      2007-12-10 09:21
    不错
     回复 引用 查看   
  22. #22楼 txdlf      2007-12-12 09:04
     回复 引用 查看   
  23. #23楼 jack112344[未注册用户]2007-12-15 20:06
    我启动调试没问题,但是去掉端口就不行了
     回复 引用   
  24. #24楼 jack112344[未注册用户]2007-12-15 20:56
    使用启动调试正常,但是发布后直接用地址栏就不行!请帮帮忙
     回复 引用   
  25. #25楼[楼主] t-mac.NET      2007-12-17 09:03
    你用httpwatch跟踪一下
     回复 引用 查看   
  26. #26楼 大石头      2007-12-17 09:28
    ◎Jeffrey Zhao

    博客园怎么也能搜到?
    这可是好东西哦。
    我做的反向代理都能识别gzip,要是搜索引擎不能识别,还真要鄙视它们
     回复 引用 查看   
  27. #27楼[楼主] t-mac.NET      2007-12-17 09:31
    @jack112344



    关于你说的问题,你是否做了如下步骤

    1:设置你IIS虚拟目录运行版本为2.0

    2:设置执行权限为 脚本和可执行文件

    3:ISAPI 的注册问题,

    1.打开IIS管理,注册ISAPI映射,比如".c"等都指向那个ASPNET_ISAPI.dll,在你的c:\windows\microsoft.net\framework\v2.0下面;
    注意,不要勾选“检查文件是否存在”的选项。
    2.打开你应用中的web.config,在system.web节中添加如下的话语:
    〈httpHandlers〉
    〈add verb="*" path="*.c" type="IHTTPHandler实现的类, 该类所在的程序集" /〉
    〈/httpHandlers〉
     回复 引用 查看   
  28. #28楼[楼主] t-mac.NET      2007-12-17 09:33
    搜索引擎支持的
     回复 引用 查看   
  29. #29楼 jack112344[未注册用户]2007-12-17 16:37
    我是xp作为iis服务器版本5.1

    web.config中
    <httpHandlers>
    <add verb="*" path="*.c" type="JackApp.CompressionHttpHandler, JackApp"/>
    <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax"/>
    </httpHandlers>

    MIME映射 .c 然后指向C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll

    调试正确,就是直接打地址不行
     回复 引用   
  30. #30楼 jack112344[未注册用户]2007-12-17 20:03
    嘿嘿 搞定了,就是映射没有弄好,谢谢大家拉!
     回复 引用   
  31. #31楼 蓝天旭日      2008-01-15 17:28
    支持....
     回复 引用 查看   
  32. #32楼 艾面条      2008-05-12 11:24
    不知道没有测试过浏览器兼容?
    感觉挺好的这类方法。
     回复 引用 查看   
  33. #33楼[楼主] t-mac.NET      2008-05-13 09:49
    @艾面条
    现在的浏览器一般都支持gzip和deflate,,,


    IE和firefox下工作得很好,其它浏览器没测试过
     回复 引用 查看   
  34. #34楼 暂放一下,别删除[未注册用户]2008-09-14 15:19
    http://www.dzend.com/article.asp?id=10
    http://www.sifung.com/pages/870.shtm
    http://topic.csdn.net/t/20050518/10/4015744.html
    http://www.cnblogs.com/babyt/archive/2005/03/14/118264.html
    http://topic.csdn.net/t/20050714/19/4145217.html
     回复 引用   
  35. #35楼 think_fish      2011-06-07 20:44
    想请教LZ一个问题
    比如我从网页上抓下来的数据是GZIP过的
    那么我如果将内容解压呢?抓下来的是HTML
     回复 引用 查看