在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言 Gzip最早由Jean-loup Gailly和Mark Adler创建,用于Unix系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是Gzip格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。 下面我们就来简单的看一下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就可以了。
|
请发表评论