前言
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就可以了。