Trong khi viết một IHttpHandler tùy chỉnh, tôi bắt gặp một hành vi mà tôi không mong đợi liên quan đến đối tượng HttpCachePolicy.Tại sao HttpCacheability.Private ngăn chặn ETags?
Trình xử lý của tôi tính toán và đặt thẻ thực thể (sử dụng phương pháp SetETag trên HttpCachePolicy được liên kết với đối tượng phản hồi hiện tại). Nếu tôi đặt kiểm soát bộ nhớ cache cho công chúng bằng cách sử dụng phương thức SetCacheability, mọi thứ hoạt động như một nét duyên dáng và máy chủ gửi cùng với tiêu đề e-tag. Nếu tôi đặt nó thành riêng tư thì tiêu đề e-tag sẽ bị chặn.
Có lẽ tôi chưa đủ cứng nhưng tôi chưa thấy bất kỳ điều gì trong thông số HTTP/1.1 có thể biện minh cho hành vi này. Tại sao bạn không muốn gửi E-Tag cho trình duyệt trong khi vẫn cấm proxy lưu trữ dữ liệu?
using System;
using System.Web;
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext ctx) {
ctx.Response.Cache.SetCacheability(HttpCacheability.Private);
ctx.Response.Cache.SetETag("\"static\"");
ctx.Response.ContentType = "text/plain";
ctx.Response.Write("Hello World");
}
public bool IsReusable { get { return true; } }
}
Sẽ trở lại
Cache-Control: private Content-Type: text/plain; charset=utf-8 Content-Length: 11
Nhưng nếu chúng ta thay đổi nó thành công nó sẽ trở
Cache-Control: public Content-Type: text/plain; charset=utf-8 Content-Length: 11 Etag: "static"
Tôi đã chạy trên máy chủ phát triển ASP.NET và IIS6 cho đến nay với cùng kết quả. Ngoài ra tôi không thể thiết lập một cách rõ ràng ETag sử dụng
Response.AppendHeader("ETag", "static")
Cập nhật: Có thể thêm tiêu đề ETag bằng tay khi chạy trong IIS7, tôi nghi ngờ điều này là do sự tích hợp chặt chẽ giữa ASP.NET và IIS7 đường ống.
Làm rõ: Đó là một câu hỏi dài nhưng câu hỏi cốt lõi là: tại sao ASP.NET thực hiện việc này, làm cách nào tôi có thể sử dụng và tôi nên làm như thế nào?
Cập nhật: Tôi sẽ chấp nhận Tony's answer vì đó là bản chất chính xác (đi Tony!). Tôi thấy rằng nếu bạn muốn mô phỏng đầy đủ HttpCacheability.Private, bạn có thể đặt khả năng lưu trữ thành ServerAndPrivate nhưng bạn cũng có bộ nhớ cache cuộc gọi. SetOmitVaryStar (true) nếu không bộ nhớ cache sẽ thêm tiêu đề Thay đổi: * vào đầu ra và bạn không muốn điều đó. Tôi sẽ chỉnh sửa câu trả lời đó khi tôi nhận được quyền chỉnh sửa (hoặc nếu bạn thấy Tony này có lẽ bạn có thể chỉnh sửa câu trả lời của mình để bao gồm cuộc gọi đó?)
Tôi không biết nếu [câu trả lời này] (http://stackoverflow.com/a/2633452/1869660) đến một câu hỏi khác mô tả lý do tại sao @Markus thêm cuộc gọi vào 'SetOmitVaryStar()', nhưng của ASP.NET 4.0 nó có thể không cần thiết nữa. – Sphinxxx