Bắt rất bối rối về tiêu đề 'Hết hạn' tại đây! Đôi khi nó hoạt động như mong đợi - và đôi khi không.Hết hạn tiêu đề khi thử nghiệm trong Chrome
Tôi đang sử dụng mã sau để đặt tiêu đề hết hạn của mình. Lưu ý điều này đang được thực hiện với ASP.NET trong một thuộc tính tùy chỉnh MVC - thats không thực sự có liên quan ở đây - nhưng giải thích nơi 'filterContext'
là đến từ.
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);
// my own custom header so we know what time it was
filterContext.HttpContext.Response.AddHeader("CurrentTime", DateTime.Now.ToString());
cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.Now.Add(cacheDuration));
cache.SetMaxAge(cacheDuration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
Điều này đôi khi sẽ cho tôi tiêu đề như thế này:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=413
Date: Wed, 18 Feb 2009 05:24:19 GMT
Expires: Wed, 18 Feb 2009 05:21:12 GMT
CurrentTime: 2/17/2009 9:21:12 PM
Đôi khi như thế này:
Cache-Control: public, must-revalidate, proxy-revalidate, max-age=600
Date: Wed, 18 Feb 2009 05:27:55 GMT
Expires: Wed, 18 Feb 2009 05:27:55 GMT
CurrentTime: 2/17/2009 9:27:55 PM
Tôi đang chạy tất cả mọi thứ thông qua Fiddler và xem để xem khi mọi thứ được tái yêu cầu và khi họ đến từ bộ nhớ cache của trình duyệt.
Bây giờ điều kỳ lạ là trong IE, bộ nhớ đệm luôn hoạt động như mong đợi. Các liên kết đến phương pháp hành động MVC ASP.NET của tôi xuất hiện trong Fiddler và sau đó khi tôi bấm vào liên kết đó một lần nữa nó đến từ bộ nhớ cache.
Tuy nhiên trong Chrome đôi khi nó sẽ và đôi khi sẽ không đến từ bộ nhớ cache! Bởi đến từ bộ nhớ cache tôi có nghĩa là không có yêu cầu HTTP bổ sung.
Ví dụ một liên kết như thế này:
http://ipv4.fiddler:62669/gallery/mainimage/2
sẽ đến từ bộ nhớ cache trong IE, nhưng trở lại với một 200 trong chrome. Sau đó, đôi khi trong Chrome nó DO đến từ bộ nhớ cache. Tôi đã thử xóa bộ nhớ cache của trình duyệt và thử lại - cùng một kết quả mỗi lần.
Chrome đang cố gắng làm điều gì đó 'thông minh' và chỉ thất bại thảm hại - hay tôi cần thêm tiêu đề?
Điều tôi đang tự hỏi là liệu nó có liên quan gì đến thực tế là ngày tiêu đề Expires
của tôi không bao giờ thực sự trong tương lai. nếu tôi nhìn vào tiêu đề của google cho hosted jQuery file của tôi, tôi thấy rằng các tiêu đề như sau (với Hết hạn ở đây trong năm 2010 - một năm trong tương lai).
Cache-Control: public, max-age=31536000
Date: Wed, 18 Feb 2009 05:44:53 GMT
Expires: Thu, 18 Feb 2010 05:44:53 GMT
Không nên hết hạn trong tương lai ??
Theo HTTP spec:
Nếu một phản ứng bao gồm cả một Expires header và một chỉ thị max-age, các chỉ max-age đè Expires tiêu đề, ngay cả khi Expires tiêu đề là hạn chế hơn. Quy tắc này cho phép máy chủ nguồn cung cấp, cho một phản hồi nhất định, thời gian hết hạn là thời gian hết hạn cho bộ nhớ cache HTTP/1.1 (hoặc sau) so với bộ nhớ cache HTTP/1.0 . Điều này có thể hữu ích nếu một số bộ đệm HTTP/1.0 nhất định HTTP/1.0 tính không đúng cách độ tuổi hoặc thời gian hết hạn, có thể là do cho đồng hồ không đồng bộ.
Do đó có vẻ như Chrome nên tôn trọng chỉ thị độ tuổi tối đa ngay cả khi 'Hết hạn' giống như thời gian hiện tại nhưng dường như không làm điều đó.
tôi thậm chí còn thêm <% = DateTime.Now.ToString()%> vào trang aspx này và chạy nó trên mạng và nó vẫn quay trở lại MỌI THỜI GIAN với 200 và cập nhật thời gian. nhưng trong IE nó được lưu trữ trong 33 giây. sai lầm –