2009-09-17 20 views
5

Tôi đang cố gắng sử dụng OutputCaching trong trang web ASP.NET MVC của mình. Vấn đề là, khi tôi thử và thay đổi giá trị của một tham số chuỗi truy vấn của tôi, nó trả về dữ liệu cho mục đầu tiên đã được yêu cầu!Caching không hoạt động ngay trong trang ASP.NET MVC của tôi?

Dưới đây là mã của tôi (với tên param thay đổi) ...

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • LƯU Ý 1: ApiAuthorize - thuộc tính tùy chỉnh để kiểm tra cho một param chuỗi truy vấn gọi là 'chính' và kiểm tra một trong từ điển bộ nhớ, để xem nó có tồn tại không.
  • CHÚ Ý 2: HandleErrorAsJson - thuộc tính tùy chỉnh trả về thông báo lỗi là json nếu một ngoại lệ được/được ném.

và đây là hai cuộc gọi mẫu tôi là làm cho hành động này: -

nên các dữ liệu từ các cuộc gọi đầu tiên (foo = hello world, Pew Pew) được trả về 200 OK. Sau đó, cuộc gọi api thứ hai sẽ trả lại 200 OK nhưng với dữ liệu từ cuộc gọi trước đó.

Ngoài ra, tôi không sử dụng bất kỳ máy chủ proxy nào. Nếu tôi nhận xét thuộc tính OutputCache, tất cả đều tốt.

Tôi cũng đã thử như sau (bằng tay danh sách mỗi lần tôi cần phải nhớ cache) .....

[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")] 

Không may mắn :(

Chú ý làm thế nào tôi cần phải chắc chắn rằng tôi bao gồm tham số API 'Khóa' như một phần của khóa duy nhất của bộ nhớ cache. Tôi không muốn mọi người tìm kiếm cùng một thứ, nhưng nếu người thứ hai không có khóa chính xác, họ sẽ không nhận được kết quả được lưu trong bộ nhớ cache , nhưng một thông báo lỗi (kỹ thuật, đó là 401 Không được ủy quyền, nhưng dù sao) ...

Thou ghts?

Trả lời

4

Danh sách tham số trong VaryByParam được cho là dấu chấm phẩy được phân tách, không được phân cách bằng dấu phẩy. Hãy thử một lần. Điều đó nói rằng, * nên đã làm việc.

+0

+1 trực tiếp tập trung vào câu hỏi tại bàn tay không sao. mặc dù tôi không nghĩ đó là vấn đề duy nhất anh ta có ở đây. cũng trả lời bình luận của bạn dưới đây. – dove

0

Tôi sử dụng bộ lọc cho bộ nhớ đệm đầu ra sẽ cung cấp cho chương trình kiểm soát gỡ lỗi và cũng sẽ đặt khi cần. Cảm thấy tự do để sử dụng điều này và xem nếu thiết lập nó ở đây sẽ làm cho sự khác biệt mà tôi nghĩ rằng nó có thể (cũng đảm bảo rằng bất kỳ bộ nhớ đệm trước đó được xóa)

public class CacheFilterAttribute : ActionFilterAttribute 
    { 
     private const int Second = 1; 
     private const int Minute = 60 * Second; 
     private const int Hour = 60 * Minute; 
     public const int SecondsInDay = Hour * 24; 


     /// <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 int DurationInDays 
     { 
      get { return Duration/SecondsInDay; } 
      set { Duration = value * SecondsInDay; } 
     } 

     public CacheFilterAttribute() 
     { 
      Duration = 10; 
     } 

     public override void OnActionExecuted(ActionExecutedContext 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"); 
     } 
    } 

Tôi chỉ sử dụng cho đến nay cho một phần rất tĩnh của một trang web, vì vậy có một cuộc gọi như thế này

[CacheFilter(DurationInDays = 1)] 

Rõ ràng bạn chỉ muốn mở rộng này để có VaryByParams tiếp xúc như một thuộc tính, có thể cung cấp nhưng có vẻ như bạn muốn biết phải làm gì.

+0

Không quan tâm, tại sao bạn lại tạo thuộc tính của riêng mình ở đây? –

+0

Tôi đã đăng ký một vài lượt xem và sẽ làm nhiều hơn. Tôi đã không được 100% trên các thiết lập chính xác mà bạn nhìn thấy ở trên và vì vậy với điều này tôi dễ dàng có thể tinh chỉnh và biết nó đã được áp dụng ở khắp mọi nơi.Tôi vẫn không cố định xem có nên thêm nhiều tiêu đề hơn khi đặt bộ nhớ cache hay không. Tất nhiên nếu tôi tìm thấy điều này là một ý tưởng tồi tôi có thể làm cho điều này một phần mở rộng sạch của thuộc tính OutputCache và không mất gì cả. Vì vậy, trong ngắn hạn, đã có một cái gì đó để đạt được với một con đường rõ ràng để an toàn nếu có rủi ro phát sinh. – dove

+0

Không có gì sai với những gì anh ta đã làm ở đây, nhưng nó không trả lời câu hỏi của bạn. Bộ lọc mà anh ta đã tạo sẽ ảnh hưởng đến trình duyệt * bộ nhớ đệm, không phải bộ nhớ đệm của máy chủ. Đó là hợp pháp để làm, và tôi không nhận thức được bất cứ điều gì được xây dựng vào ASP.NET MVC mà nó. Nó cũng, ngầm định, làm cho một điểm tốt, đó là có hai bộ đệm khác nhau tại chơi ở đây, một trong trình duyệt và một trong máy chủ. Câu hỏi của bạn xuất hiện với tôi để có liên quan đến bộ nhớ cache của máy chủ, mặc dù nó sẽ là tốt để tăng gấp đôi kiểm tra này với Firebug hoặc Fiddler. –

Các vấn đề liên quan