2010-06-08 26 views
7

Tôi đang sử dụng sản lượng bộ nhớ đệm trong handler HTTP tùy chỉnh của tôi theo cách sau:Output caching trong HTTP Handler và SetValidUntilExpires

public void ProcessRequest(HttpContext context) 
    { 
     TimeSpan freshness = new TimeSpan(0, 0, 0, 60); 
     context.Response.Cache.SetExpires(DateTime.Now.Add(freshness)); 
     context.Response.Cache.SetMaxAge(freshness); 
     context.Response.Cache.SetCacheability(HttpCacheability.Public); 
     context.Response.Cache.SetValidUntilExpires(true); 
     ... 
    } 

Nó hoạt động, nhưng vấn đề là làm mới trang với F5 dẫn đến tái sinh trang (thay vì sử dụng bộ nhớ cache) mặc dù dòng mã cuối cùng:

context.Response.Cache.SetValidUntilExpires(true); 

Mọi đề xuất?

UPD: Có vẻ như nguyên nhân của sự cố là phản hồi trình xử lý HTTP không phải là bộ nhớ đệm trên máy chủ. Mã sau hoạt động tốt cho biểu mẫu web, nhưng không hoạt động cho trình xử lý:

 Response.Cache.SetCacheability(HttpCacheability.Server); 

Có một số chi tiết cụ thể về bộ nhớ đệm của trình xử lý http trên máy chủ không?

Trả lời

18

tôi đã tìm thấy lý do. Tham số chuỗi truy vấn đang sử dụng trong URL của tôi, do đó, nó trông giống như "http://localhost/Image.ashx?id=49". Tôi đã nghĩ rằng nếu VaryByParams không được thiết lập rõ ràng, máy chủ sẽ luôn luôn có giá trị của id param vào tài khoản, bởi vì context.Response.Cache.VaryByParams.IgnoreParams là false theo mặc định. Nhưng trên thực tế, máy chủ không sử dụng bộ nhớ cache ở tất cả trong trường hợp này (tuy nhiên trình duyệt người dùng không).

Vì vậy, nếu tham số được sử dụng trong chuỗi truy vấn, Response.Cache.VaryByParams nên được thiết lập một cách rõ ràng, giống như

context.Response.Cache.VaryByParams.IgnoreParams = true; 

cho bỏ qua các tham số hoặc

context.Response.Cache.VaryByParams[<parameter name>] = true; 

cho sự thay đổi của một số tham số hoặc

context.Response.Cache.VaryByParams["*"] = true; 

để biến đổi theo tất cả các thông số.

+0

Cảm ơn bạn đã tìm giải pháp này, đã làm việc cho tôi với các tham số truy vấn có giá trị đơn. Nhưng khi tôi có một tham số đa giá trị như '? Id = 1 & id = 2 & id = 3' thì điều này vẫn không hoạt động. Tôi không biết tại sao, nhưng muốn cho người khác biết về nó. – Oliver

0

tính năng lưu trữ công cộng phụ thuộc vào trình duyệt hoặc proxy người dùng, nó chỉ định rằng phản hồi có thể lưu vào bộ nhớ cache của khách hàng và bộ nhớ cache (proxy) được chia sẻ.

có bạn đã cố gắng sử dụng HttpCacheability.Server

http://msdn.microsoft.com/en-us/library/system.web.httpcacheability(v=VS.71).aspx

+0

Tôi đã thử nó, nhưng trong trường hợp này, bộ nhớ đệm không hoạt động chút nào. Tôi sử dụng máy chủ phát triển ASP.NET. – mayor