Tôi không chắc liệu đây có phải là sự cố máy chủ hay không hoặc liệu tôi có hiểu được cách bộ đệm HTTP thực sự hoạt động hay không.Lỗi nhầm lẫn HTTP caching
Tôi có ứng dụng ASP MVC chạy trên IIS7. Có rất nhiều nội dung tĩnh như một phần của trang web bao gồm rất nhiều tệp CSS, Javascript và hình ảnh.
Đối với những tệp này, tôi muốn trình duyệt lưu chúng trong ít nhất một ngày - các tệp .css, .js, .gif và .png của chúng tôi hiếm khi thay đổi.
web.config của tôi đi như thế này:
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge"
cacheControlMaxAge="1.00:00:00" />
</staticContent>
</system.webServer>
Vấn đề tôi nhận được là trình duyệt (thử nghiệm Chrome, IE8 và FX) dường như không được bộ nhớ đệm các tập tin như tôi muốn chờ đợi. Tôi đã có các thiết lập mặc định (kiểm tra các trang mới hơn tự động trong IE).
Trong chuyến viếng thăm đầu tiên tải nội dung như mong đợi
HTTP/1.1 200 OK
Cache-Control: max-age=86400
Content-Type: image/gif
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:29:16 GMT
Content-Length: 918
<content>
Tôi nghĩ rằng Cache-Control: max-age=86400
nên nói với các trình duyệt không yêu cầu trang một lần nữa cho một ngày.
Ok, vậy bây giờ trang được tải lại và trình duyệt yêu cầu lại hình ảnh. Lần này nó được phản hồi trống với các tiêu đề:
HTTP/1.1 304 Not Modified
Cache-Control: max-age=86400
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:30:32 GMT
Vì vậy, nó trông giống như trình duyệt đã gửi ETag
lại (như là một id duy nhất cho tài nguyên), và của máy chủ trở lại với một 304 Not Modified - cho trình duyệt biết rằng nó có thể sử dụng tệp đã tải xuống trước đó.
Dường như với tôi điều đó sẽ đúng cho nhiều tình huống lưu vào bộ nhớ cache, nhưng ở đây tôi không muốn có thêm chuyến đi khứ hồi. Tôi không quan tâm nếu hình ảnh bị lỗi thời khi tệp trên máy chủ thay đổi.
Có rất nhiều tệp này (ngay cả với bản đồ sprite và các loại tương tự) và nhiều khách hàng của chúng tôi có mạng rất chậm. Mỗi chuyến đi khứ hồi để ping cho trạng thái này mất khoảng 10 đến 5 giây. Nhiều người cũng có IE6 chỉ có 2 kết nối HTTP tại một thời điểm. Kết quả thực là ứng dụng của chúng tôi dường như rất chậm đối với những khách hàng này với mỗi trang mất thêm vài giây để kiểm tra xem nội dung tĩnh có thay đổi hay không.
Tôi đang thiếu tiêu đề phản hồi nào khiến trình duyệt tích cực lưu vào bộ nhớ cache?
Tôi làm cách nào để thiết lập điều này trong web.config cho IIS7?
Tôi có hiểu nhầm về cách hoạt động của bộ đệm ẩn HTTP ở địa điểm đầu tiên không?
Bạn có thể tắt ETag không? Điều đó có thể khắc phục bạn, nhưng tôi không chắc chắn. –
Tôi sẽ thử loại bỏ ETag, nhưng đối với máy chủ thử nghiệm của tôi có vẻ khớp với – Keith
Nếu bạn nhấn làm mới hoặc F5, trình duyệt sẽ luôn yêu cầu máy chủ (có thể là yêu cầu có điều kiện) bất kể cài đặt bộ nhớ cache –