Xin chào bạn!
Hãy đăng ký thành viên để được cập nhật nhiều thông tin kiến thức hữu ích từ diễn đàn.
Đăng ký | Đăng nhập
Hệ thống mới thay đổi thuật toán mã hóa nên các bạn vui lòng vào Quên mật khẩu để tạo mật khẩu mới.

Kenh radio online [NEW]


#2168 18/08/2010 09:47 AM
Nhóm :
Member
Tham gia:
16-06-2010
Bài viết:
31
Lần thăm:
301

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:

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

Những thành viên thích:
1 thành viên thích bài viết này:
faphach (15/10/2011 10:13 AM)
#2256 26/08/2010 05:08 PM
Nhóm :
Member
Tham gia:
09-08-2010
Bài viết:
0
Lần thăm:
23

Dùng caching và compression filter cho Action ASP.NET MVC

Bài hay hữu ích wa. Nếu dc bạn cho mình xin đoạn code WhoIsOnline của trang này luôn với. Mình đang cần.

#2301 30/08/2010 10:22 AM
Nhóm :
Member
Tham gia:
16-06-2010
Bài viết:
31
Lần thăm:
301

Dùng caching và compression filter cho Action ASP.NET MVC

Cài WhoIsOnline cũng không khó đâu bạn căn cứ vào UserAgent rồi check là ra thôi.

Trong .Net có sẵn những Properties
Request.Browser.Browser
Request.Browser.Version
Request.Browser.Platform

Ngoài ra còn 1 số ngoại lệ bạn có thể dùng <browserCaps> trong webconfig hoặc check UserAgent

Bạn cứ thử làm trc nếu không đc mình sẽ hướng dẫn chi tiết hơn. Mình có thể gửi ngay cho bạn. Nhưng gặp những cái mới nữa bạn sẽ không tự làm đc.

Cứ làm thử rồi bạn sẽ thấy nó không khó

Chúc bạn thành công

#2374 13/09/2010 02:37 PM
Nhóm :
Member
Tham gia:
09-08-2010
Bài viết:
0
Lần thăm:
23

Dùng caching và compression filter cho Action ASP.NET MVC

Thank! Mình cũng biết .NET cung cấp các thuộc tính ngoài một số thuộc tính về trình duyệt như nói trên còn có thể biết được thông tin người dùng đang đăng nhập như:
Dns.GetHostByAddress(Request.ServerVariables.Get("REMOTE_HOST"))
Request.UserHostAddress
Request.UserHostName
.....

Nhưng mình không biết mình nên làm thế nào thôi. Khi người dùng đăng nhập mình đã lưu xuống sesion 1 vài thông tin. Có cần thiết tạo bảng để lưu thông tin mỗi lần user đăng nhập không? Để khi đó nếu muốn lấy thông tin ai đang online mình chỉ cần select từ bảng đó ra thôi? Hay không cần? Mình mới tập tành học ASP.NET nên mong được chỉ giáo tận tình. Cám ơn nhiều

#3229 15/10/2011 10:12 AM
Nhóm :
Member
Tham gia:
15-10-2011
Bài viết:
1
Lần thăm:
0
FilterExecutingContext cái này cho mình hỏi là thế nào nhỉ ? nó là ứng dụng có sẵn hay bạn viết ra vậy có thể cho code dc không

#3230 15/10/2011 12:47 PM
Nhóm :
Member
Tham gia:
28-09-2011
Bài viết:
1
Lần thăm:
5
Mình đang dùng blowery.Web.HttpCompress.dll cho dự án ASP.NET của mình, liệu có thể sử dụng CompressFilter vào dự án ASP.NET hay không ? Và sử dụng như thế nào anh Hổ hướng dẫn mình với.

#3232 16/10/2011 08:11 PM
Nhóm :
Member
Tham gia:
16-06-2010
Bài viết:
31
Lần thăm:
301
Trích bài của: faphach

FilterExecutingContext cái này cho mình hỏi là thế nào nhỉ ? nó là ứng dụng có sẵn hay bạn viết ra vậy có thể cho code dc không



FilterExecutingContext là class có sẵn trong thư viện System.Web.Mvc

Mã nguồn có ngay ở trên mà bạn

#3233 16/10/2011 08:21 PM
Nhóm :
Member
Tham gia:
16-06-2010
Bài viết:
31
Lần thăm:
301
Trích bài của: onevn

Mình đang dùng blowery.Web.HttpCompress.dll cho dự án ASP.NET của mình, liệu có thể sử dụng CompressFilter vào dự án ASP.NET hay không ? Và sử dụng như thế nào anh Hổ hướng dẫn mình với.



Đối với asp.net bạn dùng blowery.Web.HttpCompress.dll cũng ổn rồi. hoặc dùng http://mbcompression.codeplex.com