2012-02-08 16 views
5

Czy jest jakiś sposób w kodzie JavaScript lub C#, aby stwierdzić, czy przeglądarka, z której korzysta ktoś, wyłączyła buforowanie zawartości statycznej?Jak sprawdzić, czy buforowanie przeglądarki wyłączone?

Muszę mieć możliwość sprawdzenia, czy przeglądarka jest zoptymalizowana do buforowania.

+0

Co masz na myśli mówiąc "przeglądarka jest zoptymalizowana do buforowania"? Czy obsługuje etag lub jakiś konkretny nagłówek pamięci podręcznej? –

+0

Możesz wyłączyć przechowywanie plików statycznych w ustawieniach przeglądarki. Czy istnieje sposób sprawdzenia, czy ta pamięć jest wyłączona? – gaffleck

Odpowiedz

2

UPDATE

zrobiłem trochę więcej dochodzenia problemu i można znaleźć bardziej szczegółowe answer in my recent post pamiętać, że rozwiązanie opisane poniżej (początkowo) nie jest rozwiązaniem krzyż przeglądarki.

Nie jestem pewien, czy to pomaga, ale możesz spróbować następującej sztuczki: 1. Dodaj trochę strony do zasobu, załóżmy, że będzie to plik javascript cachedetect.js. 2. Serwer powinien generować cachedetect.js za każdym razem, gdy ktoś o to poprosi. W odpowiedzi powinien zawierać nagłówki związane z pamięcią podręczną, tzn. Jeśli pamięć podręczna przeglądarki jest włączona, zasób powinien być buforowany przez długi czas. Każdy cachedetect.js powinna wyglądać następująco:

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(); 

Po tym można po prostu sprawdzić cacheEnabled === true lub cacheEnabled === false po pewnym okresie czasu.

+0

Podoba mi się to podejście, chociaż jeszcze go nie rozumiem. Dam ci szansę i dam ci znać, co znajdę. Dzięki za pomoc! – gaffleck

+0

Zasadniczo ładuje ten sam skrypt (ale z inną zmienną wersji) kilka razy i sprawdza, czy zmienna wersji została zmieniona czy nie. Zostanie zmieniony, jeśli pliki pochodzą bezpośrednio z serwera (ponieważ generuje ten plik za każdym razem), a jego (zmienna wersji) będzie taka sama, jeśli pochodzi z pamięci podręcznej przeglądarki. –

0

Wierzę, że to powinno działać: http://jsfiddle.net/pseudosavant/U2hdy/

Zasadniczo trzeba wczytywać plik dwa razy i sprawdzić, jak długo to trwało. Drugi raz powinien zająć mniej niż 10 ms (w moim własnym testowaniu). Będziesz chciał upewnić się, że testowany plik jest wystarczająco duży, aby pobrać go w wersji bitowej, ale nie musi być duży.

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

Czas może się różnić w zależności od niezawodności sieci urządzenia (nawet w przypadku dwóch kolejnych żądań). Proponuję unikać takich kontroli ... –

+0

Spojrzałem na to dalej i tak, wszystko w tym obszarze będzie hakiem. Próbowałem różnych sposobów określania czasu pobierania i konsekwentnie trwało to> 10 ms, jeśli nie było to trafienie z pamięci podręcznej i poniżej <10 ms, jeśli było, FWIW. – pseudosavant

0

Inne podejście obejmujące klienta i serwer.

  1. Zadzwoń do strony/punktu końcowego, który ustawi losowy unikalny identyfikator w odpowiedzi. Ustawić nagłówek cache dla tej strony/końcowego
  2. popełnić tego samego połączenia ponownie, co będzie ustawić inny unikalny numer
  3. Jeśli numery pasuje ona pochodzi z cache albo pochodzi z serwera
Powiązane problemy