2009-02-16 35 views
7

Tôi muốn có thể đặt thời gian hết hạn dài cho một số mục nhất định mà người dùng tải xuống qua yêu cầu GET.Cách tốt nhất để làm việc với tiêu đề Expires trong ASP.NET MVC?

Tôi muốn nói 'điều này tốt trong 10 phút' (nghĩa là tôi muốn đặt tiêu đề Hết hạn trong 10 phút). Các yêu cầu là các đoạn HTML được hiển thị trong trang thông qua AJAX và chúng tốt cho phiên của người dùng. Tôi không muốn quay lại máy chủ và nhận 304 nếu họ cần chúng một lần nữa - Tôi muốn bộ nhớ cache của trình duyệt ngay lập tức cung cấp cho tôi cùng một mục.

Tôi tìm thấy một bài viết gần một tuổi về số MVC Action filter caching and compression. Điều này tạo ra một ActionFilter tùy chỉnh để thay đổi tiêu đề hết hạn. Tôi đã sử dụng bộ lọc nén mà làm việc tuyệt vời cho một số css tùy chỉnh tôi đang tạo ra (tỷ lệ nén 94%!).

Tôi có hai mối quan tâm chính:

1) Tôi có thực sự phải sử dụng phương pháp này hay không. Tôi tốt với nó nếu tôi làm, nhưng là có thực sự không có chức năng trong MVC hoặc chức năng OutputCache để làm điều này cho tôi? Trong 'truyền thống' ASP.NET tôi đã luôn luôn chỉ cần thiết lập các tiêu đề hết hạn bằng tay, nhưng chúng tôi không thể làm điều đó nữa - ít nhất là không có trong bộ điều khiển.

2) Nếu tôi sử dụng phương pháp lọc này - nó sẽ can thiệp vào chính sách OutputCache chút nào - mà tôi muốn có thể kiểm soát trong web.config. Tôi là loại suy nghĩ hai là loại trừ lẫn nhau và bạn sẽ không muốn cả hai - nhưng tôi không hoàn toàn chắc chắn.

Trả lời

3
  1. Không, bạn không để sử dụng phương pháp này. Tuy nhiên, tôi nghĩ rằng nó có lẽ là phương pháp tốt nhất để lựa chọn, bởi vì nó làm cho bộ điều khiển dễ kiểm tra hơn và ít nhận thức về web hơn. Phương án thay thế sẽ là đặt tiêu đề theo cách thủ công trong Bộ điều khiển, như sau:

    Response.AddHeader ("Hết hạn", "Thu, 01 Dec 1994 16:00:00 GMT");

  2. Vâng, thuộc tính OutputCache kiểm soát thời điểm hành động chạy hoàn toàn và khi nó trả về HTML được lưu trong bộ nhớ cache thay thế. Hết hạn cho trình duyệt biết khi nào tìm nạp lại HTML. Vì vậy, tôi sẽ không gọi họ là loại trừ lẫn nhau, nhưng họ chắc chắn là hai mặt của cùng một đồng tiền, và bạn có quyền nghĩ rằng bạn có thể không cần cả hai. Tôi khuyên bạn nên xem xét the HTTP spec để quyết định điều gì là thích hợp nhất cho ứng dụng của bạn.

+0

@craig nhờ cho đầu vào của bạn. tôi đoán quy tắc ngón tay cái liên quan đến số 2 là nếu chế độ xem được tạo rất đơn giản (nghĩa là không có quyền truy cập cơ sở dữ liệu) thì hết hạn có thể là tất cả những gì cần thiết. nếu mười cuộc gọi phương thức web được yêu cầu thì bạn sẽ muốn sử dụng OutputCache. đôi khi bạn muốn đầu VÀ đuôi phải :-) –

+3

Hãy xem xét: Nếu 10 người (trên các máy tính khác nhau) yêu cầu trang của bạn 10 lần, hết hạn có nghĩa là hành động của bạn chạy 10 lần và máy chủ xử lý 10 yêu cầu. Caching một mình có nghĩa là hành động của bạn chạy một lần và máy chủ xử lý 100 yêu cầu. Hết hạn và bộ nhớ đệm cùng nhau có nghĩa là hành động của bạn chạy một lần và máy chủ xử lý 10 yêu cầu. –

2

Response.Expires Thuộc tính này quy định cụ thể số lượng phút trước khi một cache trang trong trình duyệt hết hạn nghĩa. nếu người dùng quay lại cùng một trang trước số phút được chỉ định, phiên bản được lưu trong bộ nhớ cache của trang sẽ được hiển thị.

Trả lời.ExpiresAbsolute Sử dụng thuộc tính này, chúng tôi có thể đặt ngày và/hoặc thời gian trang được lưu trong bộ nhớ cache hết hạn.

http://forums.asp.net/t/1532229.aspx

0

Có vẻ như bạn chỉ cần thay đổi tùy theo người sử dụng:

http://aspadvice.com/blogs/ssmith/archive/2007/10/29/VaryByCustom-Caching-By-User.aspx

[OutputCache(Duration="10", VaryByCustom="username")] 

Global.asax:

public override string GetVaryByCustomString(HttpContext context, string key) 
{ 
    switch(key) 
    { 
     case "username": 
      return context.User.Identity.Name; 

     // Other VaryByCustom strategy implementations can go here. 
    } 

    return string.Empty; 
} 
Các vấn đề liên quan