Dùng caching và compression filter cho Action ASP.NET MVC
Hôm nay một ngày công việc không khác
gì mọi ngày với các dự án đang làm. Dự án phát triển với ASP.Net MVC
chạy rất tốt và rất suôn sẽ nhưng khi dự án này đang phình to lên tôi
cảm thấy có nhiều vấn đề trên MVC này. Tôi không biết mình coding có vần
gì không, nhưng thật sự là không vần đề gì, tôi chợt nghỉ đến có lẻ lưu
lượng truyền tải quá lớn, và xử lý sự kiện chưa được hoàn hảo lắm.
Tôi bắt tay coding một filter cho các hình ảnh và caching nó xem sao trước tiên tôi là Caching:
Caching đóng một vai trò quan
trọng trong việc phát triển ứng dụng web cao khả năng mở rộng. Chúng ta
có thể nhớ cache http nhận được bất cứ yêu cầu trong các trình duyệt của
người dùng trong một thời gian định sẵn, nếu có yêu cầu người sử dụng
cùng một URL trong thời gian đó được xác định trước những phản ứng sẽ
được tải từ bộ nhớ cache của trình duyệt, thay vì máy chủ. Bạn có thể
lưu trữ trong cùng một ứng dụng ASP.NET MVC với ActionFilter sau đây:
Khi class được phát triển xong, công việc của tôi là đưa nó vào trong action là ok.
Đây là màn hình khi tôi không áp dụng CompressFilter cho action của tôi :
Và đây là màn hình khi tôi đã áp dụng CompressFiltercho action :
Ngoài ra tôi cũng có thể cả hai filter cho action của tôi :
Vậy là đã hoàn tất, bây giờ web của tôi đã nhanh hơn rất nhiều. Mong rằng bài viết sẽ giúp các bạn ột phần nào đó. Chúc bạn thành công.
Ghi Chú : Nếu bạn đang dùng ASP.Net Mvc 1 hay 2 nên thay thế FilterExecutingContext = ActionExecutingContext.
Source: http://kythuatlaptrinh.blogspot.com
using System;
using System.Web;
using System.Web.Mvc;
public class CacheFilterAttribute : ActionFilterAttribute
{
///
/// Gets or sets the cache duration in seconds. The default is 10 seconds.
///
/// The cache duration in seconds.
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");
}
} Bạn có thể áp dụng Filter trong Controller action method như sau :
[CacheFilter(Duration = 60)]
public void Category(string name, int? page)
Sau đây cho thấy màn hình trong bộ nhớ cache firebug khi Fiter Caching không được áp dụng:
và đây là màn hình cho thấy filter caching khi được áp dụng.
Một vấn đề khác quan trọng không
kém là Compression tại sao phải dùng và có cần dùng không? tất cả các
trình duyệt hiện đại chấp nhận nén nội dung và tiết kiệm băng thông lớn.
Bạn có thể áp dụng các action filter sau đây để nén response trong ứng
dụng MVC ASP.NET của bạn:
Đây là coding tôi đã phát triển :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);}}
} Khi class được phát triển xong, công việc của tôi là đưa nó vào trong action là ok.
[CompressFilter]
public void Category(string name, int? page)
Đây là màn hình khi tôi không áp dụng CompressFilter cho action của tôi :
Và đây là màn hình khi tôi đã áp dụng CompressFiltercho action :
Ngoài ra tôi cũng có thể cả hai filter cho action của tôi :
CompressFilter(Order = 1)]
[CacheFilter(Duration = 60, Order = 2)]
public void Category(string name, int? page)
Vậy là đã hoàn tất, bây giờ web của tôi đã nhanh hơn rất nhiều. Mong rằng bài viết sẽ giúp các bạn ột phần nào đó. Chúc bạn thành công.
Ghi Chú : Nếu bạn đang dùng ASP.Net Mvc 1 hay 2 nên thay thế FilterExecutingContext = ActionExecutingContext.
Source: http://kythuatlaptrinh.blogspot.com




