2012-02-08 67 views
5

Có cách nào trong Javascript hoặc C# để biết trình duyệt mà ai đó đang sử dụng có vô hiệu hóa bộ nhớ đệm của nội dung tĩnh không?Cách kiểm tra xem bộ nhớ cache của trình duyệt có bị vô hiệu hóa

Tôi cần có khả năng kiểm tra xem trình duyệt có được tối ưu hóa cho bộ nhớ đệm hay không.

+0

gì bạn có nghĩa là trong khi nói "trình duyệt được tối ưu hóa cho bộ nhớ đệm"? Nó có hỗ trợ etag hoặc một số tiêu đề bộ nhớ cache cụ thể không? –

+0

Bạn có thể tắt lưu trữ các tệp tĩnh trong cài đặt trình duyệt. Có cách nào để kiểm tra xem bộ nhớ đó có bị vô hiệu không? – gaffleck

Trả lời

2

CẬP NHẬT

tôi đã điều tra thêm một chút của vấn đề và bạn có thể tìm thấy chi tiết hơn answer in my recent post Lưu ý, các giải pháp được mô tả dưới đây (ban đầu) không phải là giải pháp trình duyệt chéo.

Không chắc chắn nếu nó có ích, nhưng bạn có thể thử mẹo sau: 1. Thêm một số tài nguyên vào trang của bạn, giả sử nó sẽ là tệp javascript cachedetect.js. 2. Máy chủ sẽ tạo ra cachedetect.js mỗi lần ai đó yêu cầu. Và nó phải chứa tiêu đề liên quan đến bộ nhớ cache để phản hồi, tức là nếu bộ nhớ cache của trình duyệt được bật, tài nguyên sẽ được lưu trong bộ nhớ cache trong thời gian dài. Mỗi cachedetect.js sẽ trông như thế này:

var version = [incrementally generated number here]; 
var cacheEnabled; //will contain the result of our check 
var cloneCallback;//function which will compare versions from two javascript files 

function isCacheEnabled(){ 
    if(!window.cloneCallback){ 
     var currentVersion = version;//cache current version of the file 
     // request the same cachedetect.js by adding <script> tag dynamically to <header> 
     var head = document.getElementsByTagName("head")[0]; 
     var script = document.createElement('script'); 
     script.type = 'text/javascript'; 
     script.src = "cachedetect.js"; 
     // newly loaded cachedetect.js will execute the same function isCacheEnabled, so we need to prevent it from loading the script for third time by checking for cloneCallback existence  
     cloneCallback = function(){ 
      // once file will be loaded, version variable will contain different from currentVersion value in case when cache is disabled 
      window.cacheEnabled = currentVersion == window.version;   
     };  
     head.appendChild(script); 

    } else { 
     window.cloneCallback(); 
    } 
} 

isCacheEnabled(); 

Sau đó bạn chỉ có thể kiểm tra cacheEnabled === true hoặc cacheEnabled === false sau một khoảng thời gian.

+0

Tôi thích cách tiếp cận này mặc dù tôi chưa hiểu đầy đủ. Tôi sẽ cung cấp cho nó một shot và cho bạn biết những gì tôi tìm thấy. Cảm ơn đã giúp đỡ! – gaffleck

+0

Về cơ bản nó tải cùng một tập lệnh (nhưng với biến phiên bản khác nhau) nhiều lần và xem liệu biến phiên bản đã được thay đổi hay chưa. Nó sẽ được thay đổi nếu các tập tin đến trực tiếp từ máy chủ (vì nó tạo ra tập tin này mỗi lần), và nó (biến phiên bản) sẽ giống nhau nếu nó xuất phát từ bộ nhớ cache của trình duyệt. –

0

Tôi tin rằng điều này sẽ làm việc: http://jsfiddle.net/pseudosavant/U2hdy/

Về cơ bản bạn phải tải trước một tập tin hai lần và kiểm tra xem nó mất bao lâu. Lần thứ hai nên mất ít hơn 10ms (trong thử nghiệm của riêng tôi). Bạn sẽ muốn đảm bảo rằng tệp bạn đang thử nghiệm đủ lớn để tải xuống, nó không cần phải lớn lắm.

var preloadFile = function(url){ 
    var start = +new Date(); 
    var file = document.createElement("img"); 
    file.src = url; 
    return +new Date() - start; 
}; 

var testFile = "http://upload.wikimedia.org/wikipedia/en/thumb/d/d2/Mozilla_logo.svg/2000px-Mozilla_logo.svg.png" 
var timing = []; 
timing.push(preloadFile(testFile)); 
timing.push(preloadFile(testFile)); 

caching = (timing[1] < 10); // Timing[1] should be less than 10ms if caching is enabled 
+0

Thời gian có thể khác nhau tùy thuộc vào độ tin cậy mạng của thiết bị (ngay cả đối với hai yêu cầu có hậu quả). Tôi muốn đề nghị để tránh kiểm tra như vậy ... –

+0

Tôi nhìn vào nó hơn nữa, và yeah, bất cứ điều gì trong lĩnh vực này sẽ là một hack. Tôi đã thử nhiều cách khác nhau để xác định thời gian tải xuống và liên tục mất> 10ms nếu nó không phải là lần truy cập được lưu trong bộ nhớ cache và dưới <10ms nếu có, FWIW. – pseudosavant

0

Một phương pháp khác liên quan đến khách hàng và máy chủ.

  1. Thực hiện cuộc gọi đến trang/điểm cuối, sẽ đặt một id duy nhất ngẫu nhiên để phản hồi. Đặt tiêu đề bộ nhớ cache cho trang này/endpoint
  2. Làm cho cuộc gọi cùng một lần nữa, mà sẽ thiết lập một số độc đáo khác nhau
  3. Nếu những con số phù hợp với nó đến từ bộ nhớ cache hoặc nó được đến từ máy chủ
Các vấn đề liên quan