Asp.Net MVC 3.0 使用Gzip压缩
前言
Gzip最早由Jean-loup Gailly和Mark Adler创建,用于Unix系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是Gzip格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。
HTTP协议上的Gzip编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用Gzip压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载. 一般服务器中都安装有这个功能模块的。
下面我们就来简单的看一下Gzip技术如何应用与Asp.Net Mvc3Web程序中。简单的原理就是:用户发送一个请求给服务端,然后服务端根据客户端的请求,将客户端请求的页面或者数据再返回到客户端的过程。
未压缩前数据展示
首先建一个Asp.Net MVC3.0Web应用程序,然后创建程序后直接运行程序。
可以看到应用程序正常运行,我们现在就通过这个页面进行简单的测试。现在页面几乎没什么数据。我们就多复制一下
<p> To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. </p>
然后刷新页面,现在通过火狐进行,并通过F12进行查看相信请求信息(这里你需要安装火狐的插件Firebug)或者直接使用Fiddler,再或者Google浏览器,当然也还有其他很多的工具。
可以看到一次请求,以及现在页面的大小58.3KB。
通过Gzip进行压缩
这里使用的原理,我粗俗的理解就是:服务端接到请求后,对于返回的数据页面进行Gzip压缩,那么在什么时候进行处理呢?
现在就用到了在接到请求的时候,熟悉MVC的朋友应该记得Action过滤器
public class CompressAttribute:ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; if (!string.IsNullOrEmpty(acceptEncoding)) { acceptEncoding = acceptEncoding.ToLower(); var response = filterContext.HttpContext.Response; if (acceptEncoding.Contains("gzip")) { response.AppendHeader("Content-encoding", "gzip"); response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); } else if (acceptEncoding.Contains("deflate")) { response.AppendHeader("Content-encoding", "deflate"); response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); } } } }
代码很简单了,就是重写了过滤器中的OnActionExecuting 就是在Action每次执行前先执行OnActionExecuting。
因为它CompressAttribute过滤器就可以在对应的需要压缩数据的Action上进行标识
[Compress] public ActionResult Index() { ViewBag.Message = "Welcome to ASP.NET MVC!"; return View(); }
这样当这个Action发生请求的时候返回到客户端的数据页面就会有明显的压缩效果了。
那么如果在我们的程序中每个Action都需要进行压缩处理的话,每个Action都要这样加,感觉很麻烦。所以这里我们可以这样来处理
[Compress] public class BaseController : Controller { }
定义一个基类Controller,然后之后的所有控制器都进行继承,那么基类Controller的属性也会继承。
public class HomeController : BaseController { public ActionResult Index() { ViewBag.Message = "Welcome to ASP.NET MVC!"; return View(); } public ActionResult About() { return View(); } }
就不用在每个Action都进行过滤器属性的标识了。
哇 只有802B勒,我感觉有点假,怎么会变得这么小了呢,不管怎么样的确是压缩了,有待在实际项目中进行整合。
总结
可以多测试几个页面,这压缩的也太小了。
这是我简单的测试Demo下载地址http://pan.baidu.com/s/1kTxbn
如果你想测试未加Gzip时的页面,那么就直接把继承的BaseController改为Controller就可以了。