7

tôi thực hiện một yêu cầu Ajax trong đó tôi thiết lập năng bộ nhớ cache phản ứng và tiêu đề được sửa đổi lần cuối:refresh cứng và bộ nhớ đệm XMLHttpRequest trong Internet Explorer/Firefox

if (!String.IsNullOrEmpty(HttpContext.Current.Request.Headers["If-Modified-Since"])) 
{ 
    HttpContext.Current.Response.StatusCode = 304; 
    HttpContext.Current.Response.StatusDescription = "Not Modified"; 
    return null; 
} 
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public); 
HttpContext.Current.Response.Cache.SetLastModified(DateTime.UtcNow); 

này hoạt động như mong đợi. Lần đầu tiên tôi thực hiện yêu cầu Ajax, tôi nhận được 200 OK. Lần thứ hai tôi nhận được 304 Not Modified.

Khi tôi làm mới cứng trong Chrome (Ctrl + F5), tôi nhận được 200 OK - tuyệt vời!

Khi tôi làm mới khó khăn trong Internet Explorer/Firefox, tôi nhận được 304 Not Modified. Tuy nhiên, mọi tài nguyên khác (JS/CSS/HTML/PNG) trả về 200 OK.

Lý do là vì tiêu đề "Nếu không được sửa đổi" được gửi cho XMLHttpRequest bất kể làm mới cứng trong các trình duyệt đó. Tôi tin rằng Steve Souders ghi lại nó here.

Tôi đã thử đặt ETag và điều chỉnh trên "If-None-Match" thành không có sẵn (được đề cập trong các nhận xét trên trang Steve Souders).

Có ai có bất kỳ đá quý trí tuệ nào ở đây không?

Cảm ơn, Bến

Cập nhật

tôi có thể kiểm tra "If-Modified-Since" chống lại một ngày sửa đổi cuối cùng được lưu trữ. Tuy nhiên, hy vọng câu hỏi này sẽ giúp những người dùng SO khác tìm thấy tiêu đề được đặt không chính xác.

Cập nhật 2

Trong khi yêu cầu được gửi với "If-Modified-Since" tiêu đề mỗi lần. Internet Explorer thậm chí sẽ không thực hiện yêu cầu nếu hết hạn không được đặt hoặc được đặt thành ngày trong tương lai. Vô ích!

Cập nhật 3

này cũng có thể là một blog sống bây giờ. Internet Explorer không làm phiền yêu cầu thứ hai khi localhost. Sử dụng IP thực hoặc loopback sẽ hoạt động.

+1

Bạn đã cố gắng ngăn chặn bộ nhớ đệm bằng cách thay đổi tên tệp ở mỗi yêu cầu bằng cách sử dụng số ngẫu nhiên hoặc giá trị ngày giờ trong đường dẫn src script của bạn (như src = 'myscript.js? Q = 45920')? –

+0

Tôi muốn nó được lưu trữ trừ khi nó đến từ một làm mới khó. Do đó, việc đặt tham số chuỗi truy vấn ngẫu nhiên không giúp ích gì. Nhờ đề nghị mặc dù! –

Trả lời

2

Trước IE10, IE không áp dụng Cờ làm mới (xem http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the-refresh-button.aspx) cho các yêu cầu không được thực hiện như một phần tải tài liệu.

Nếu muốn, bạn có thể điều chỉnh URL mục tiêu để chứa một nonce để ngăn bản sao được lưu trong bộ nhớ cache đáp ứng yêu cầu trong tương lai. Ngoài ra, bạn có thể gửi max-age = 0 để buộc IE điều chỉnh lại tài nguyên trước mỗi lần sử dụng lại.

Đối với lý do tại sao các trình duyệt reuses một tài nguyên lưu trữ mà không nêu rõ một đời, vui lòng xem http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx

+0

Cảm ơn câu trả lời và bài viết. Đó là một khu vực khó hiểu, không chuẩn hóa. Một thỏa hiệp tốt đẹp có thể là để điều trị XHR được thực hiện từ sự kiện tải JS theo cách tương tự như tài nguyên đánh dấu. –

0

Giải pháp tôi đi đến để kiểm soát phù hợp được quản lý các tiêu đề bộ nhớ cache cho tất cả các loại theo yêu cầu.

Vì vậy, tôi đã buộc các yêu cầu chuẩn giống như XMLHttpRequests, đã yêu cầu IE sử dụng chính sách bộ nhớ cache sau: Cache-Control: private, max-age = 0.

Vì một số lý do, IE không tôn trọng tiêu đề cho các loại yêu cầu khác nhau. Ví dụ: chính sách bộ nhớ cache của tôi cho các yêu cầu chuẩn được mặc định cho trình duyệt và cho XMLHttpRequests, nó được đặt thành chính sách kiểm soát nói trên. Tuy nhiên, yêu cầu một cái gì đó như/url như là một yêu cầu nhận được tiêu chuẩn, làm cho kết quả đúng cách. Thật không may, làm cho cùng một yêu cầu đến/url như là một XMLHttpRequest, thậm chí sẽ không nhấn máy chủ vì yêu cầu nhận được lưu trữ và XMLHttpRequest đã nhấn cùng một url.

Vì vậy, hoặc buộc chính sách bộ nhớ cache của bạn trên tất cả các mặt trận hoặc đảm bảo bạn đang sử dụng các điểm truy cập khác nhau (uri) cho các loại yêu cầu của bạn. Giải pháp của tôi là trước đây.

Các vấn đề liên quan