2012-10-17 25 views
6

bộ đệm đầu ra được triển khai trong ASP.NET MVC2 bằng cách sử dụng mã bên dưới.Tại sao GetVaryByCustomString không được gọi là

GetVaryByCustomString phương pháp không được gọi là: đặt điểm ngắt cho dòng đầu tiên của nó và ứng dụng đang chạy cho thấy rằng điểm ngắt không đạt được. Điểm ngắt trong bộ điều khiển Index() đạt được.

Cách sử dụng VaryByCustom trong ASP.NET MVC2?

Bộ điều khiển:

 [OutputCache(VaryByCustom = "user")] 
     public ActionResult Index(string _entity, string id) 
     { 
... 

Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public override string GetVaryByCustomString(HttpContext context, string arg) 
    { 
     if (arg == "user") 
     { 
      HttpCookie cookie = context.Request.Cookies["Company"]; 
      if (cookie != null) 
       return Thread.CurrentPrincipal.Identity.Name + "," + cookie.Value; 
      return Thread.CurrentPrincipal.Identity.Name; 
     } 
     return base.GetVaryByCustomString(context, arg); 
    } 

} 

Trả lời

7

nét OutputCache của bạn là sai. Bạn phải chỉ định Duration:

[OutputCache(VaryByCustom = "user", Duration = 50)] 
public ActionResult Index(string _entity, string id) 

Bây giờ, phương thức đã ghi đè GetVaryByCustomString của bạn sẽ được gọi. Cũng đừng quên rằng phương thức GetVaryByCustomString sẽ chỉ được gọi sau khi thao tác điều khiển đã thực hiện xong.

+0

Cảm ơn bạn. Sau khi thêm tiêu đề Vary: * này sẽ được gửi đến trình duyệt và điều này sẽ vô hiệu hóa bộ nhớ cache của trình duyệt. Làm thế nào để kích hoạt bộ nhớ cache của trình duyệt với VaryByCustom? – Andrus

1

tôi chỉ muốn đề cập đến 2 nguyên nhân khác

Nếu có bất kỳ [nocache] thuộc tính trong dự án, GetVaryByCustomString sẽ không cháy.

Nếu bạn đặt

Location = OutputCacheLocation.Client, 

GetVaryByCustomString sẽ không cháy.

0

Một dự án mà tôi làm việc trên thời gian gần đây đã có một bộ lọc toàn cầu ngăn chặn sản lượng bộ nhớ đệm từ làm việc:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new NoCacheResponseAttribute()); 
    } 
} 

public class NoCacheResponseAttribute : BaseActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var response = filterContext.RequestContext.HttpContext.Response; 
     response.Cache.SetCacheability(HttpCacheability.NoCache); 
     response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); 
     response.Cache.SetNoStore(); 
    } 
} 

Sau khi bình luận dòng mà thêm bộ lọc, sản lượng bộ nhớ đệm bắt đầu làm việc như mong đợi.