前言瀏覽器
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就能夠了。