ASP.NET MVC Action Filter – 緩衝與壓縮

來源:互聯網
上載者:User

原文地址: ASP.NET MVC Action Filter - Caching and Compression

下載源碼: Source.zip

關於Action Filter你可以參考我的另外一篇文章: ASP.NET MVC : Action過濾器(Filtering)

 

緩衝在開發高擴充性WEB程式的時候扮演著很重要的角色.我們可以將HTTP請求在一個定義的時間內緩衝在使用者的瀏覽器中,如果使用者在定義的時間內請求同一個URL,那麼使用者的請求將會從使用者瀏覽器的緩衝中載入,而不是從伺服器.你可以在ASP.NET MVC應用程式中使用下面的Action Filter來實現同樣的事情:

using System;using System.Web;using System.Web.Mvc;public class CacheFilterAttribute : ActionFilterAttribute{    /// <summary>    /// Gets or sets the cache duration in seconds. The default is 10 seconds.    /// </summary>    /// <value>The cache duration in seconds.</value>    public int Duration    {        get;        set;    }    public CacheFilterAttribute()    {        Duration = 10;    }    public override void OnActionExecuted(FilterExecutedContext filterContext)    {        if (Duration <= 0) return;        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;        TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);        cache.SetCacheability(HttpCacheability.Public);        cache.SetExpires(DateTime.Now.Add(cacheDuration));        cache.SetMaxAge(cacheDuration);        cache.AppendCacheExtension("must-revalidate, proxy-revalidate");    }}

你可以好像下面一樣在你的Controller Action 方法中使用這個Filter :


[CacheFilter(Duration = 60)]public void Category(string name, int? page)

下面是在firebug中當 緩衝Filter 沒有應用的時候的 :

下面的是應用了 Cache Filter 時候的 :

 

另外一個很重要的事情就是壓縮.現在的瀏覽器都可以接收壓縮後的內容,這可以節省大量的頻寬.你可以在你的ASP.NET MVC 程式中應用下面的Action Filter 來壓縮你的Response :


using System.Web;using System.Web.Mvc;public class CompressFilter : ActionFilterAttribute{    public override void OnActionExecuting(FilterExecutingContext filterContext)    {        HttpRequestBase request = filterContext.HttpContext.Request;        string acceptEncoding = request.Headers["Accept-Encoding"];        if (string.IsNullOrEmpty(acceptEncoding)) return;        acceptEncoding = acceptEncoding.ToUpperInvariant();        HttpResponseBase 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);        }    }}

然後將這個Filter應用到你的Controller Action 中 :

[CompressFilter]public void Category(string name, int? page)

下面是沒有應用壓縮的時候的 :

下面的是應用了壓縮Filter後的情形 :

你當然也可以將這兩個Filter都應用到同一個Action方法上,就好像下面所示 :


[CompressFilter(Order = 1)][CacheFilter(Duration = 60, Order = 2)]public void Category(string name, int? page)

下面是 :

Enjoy!!!

下載源碼: Source.zip

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.