1. 程式人生 > >ASP.NET MVC Action Filter

ASP.NET MVC Action Filter

快取在開發高擴充性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 沒有應用的時候的截圖 :

NoCache

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

Cache

另外一個很重要的事情就是壓縮.現在的瀏覽器都可以接收壓縮後的內容,這可以節省大量的頻寬.你可以在你的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)

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

Uncompressed

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

Compressed

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

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

下面是截圖 :

Both

Enjoy!!!