前言浏览器
Gzip最先由Jean-loup Gailly和Mark Adler建立,用于Unix系统的文件压缩。咱们在Linux中常常会用到后缀为.gz的文件,它们就是Gzip格式的。现今已经成为Internet 上使用很是广泛的一种数据压缩格式,或者说一种文件格式。
HTTP协议上的Gzip编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点经常使用Gzip压缩技术来让用户感觉更快的速度。这通常是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.通常对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.固然这也会增长服务器的负载. 通常服务器中都安装有这个功能模块的。服务器
下面咱们就来简单的看一下Gzip技术如何应用与Asp.Net Mvc3Web程序中。简单的原理就是:用户发送一个请求给服务端,而后服务端根据客户端的请求,将客户端请求的页面或者数据再返回到客户端的过程。mvc
未压缩前数据展现asp.net
首先建一个Asp.Net MVC3.0Web应用程序,而后建立程序后直接运行程序。ide
能够看到应用程序正常运行,咱们如今就经过这个页面进行简单的测试。如今页面几乎没什么数据。咱们就多复制一下工具
<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就能够了。