2012-02-08 15 views
5

¿Hay alguna manera en Javascript o en C# de indicar si el navegador que alguien está utilizando ha desactivado el almacenamiento en memoria caché del contenido estático?Cómo comprobar si el almacenamiento en memoria caché del navegador está deshabilitado

Necesito poder comprobar si el navegador está optimizado para el almacenamiento en caché.

+0

Lo ¿Quiere decir al tiempo que dice "el navegador está optimizado para el almacenamiento en caché"? ¿Admite etag o algún encabezado de caché específico? –

+0

Puede deshabilitar el almacenamiento de archivos estáticos en la configuración del navegador. ¿Hay alguna manera de probar si ese almacenamiento está deshabilitado? – gaffleck

Respuesta

2

ACTUALIZACIÓN

lo hice un poco más de investigación del problema y se puede encontrar más información detallada answer in my recent post Nota, la solución se describe a continuación (en principio) no es la solución navegadores.

No estoy seguro de si ayuda, pero puede intentar el siguiente truco: 1. Agregue un recurso a su página, digamos que será el archivo de Javascript cachedetect.js. 2. El servidor debe generar cachedetect.js cada vez que alguien lo solicite. Y debe contener encabezados relacionados con caché en respuesta, es decir, si el caché del navegador está habilitado, el recurso debe almacenarse en caché durante mucho tiempo. Cada cachedetect.js debería tener este aspecto:

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

Después de que usted puede simplemente comprobar si hay cacheEnabled === true o cacheEnabled === false después de un cierto período de tiempo.

+0

Me gusta este enfoque, aunque aún no lo entiendo del todo. Le daré una oportunidad y le diré lo que encuentro. ¡Gracias por la ayuda! – gaffleck

+0

Básicamente carga el mismo script (pero con diferentes variables de versión) varias veces y ve si la variable de versión se modificó o no. Se cambiará si los archivos provienen directamente del servidor (ya que genera este archivo cada vez), y (variable de versión) será el mismo si proviene de la memoria caché del navegador. –

0

creo que esto debería funcionar: http://jsfiddle.net/pseudosavant/U2hdy/

Básicamente, usted tiene que cargar previamente un archivo dos veces y comprobar el tiempo que tomó. La segunda vez debería tomar menos de 10ms (en mi propia prueba). Querrá asegurarse de que el archivo que está probando es lo suficientemente grande como para que se descargue en poco tiempo, aunque no tiene por qué ser enorme.

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

El tiempo puede variar dependiendo de la confiabilidad de la red del dispositivo (incluso para dos solicitudes consecutivas). Sugeriría evitar tales controles ... –

+0

Lo investigué más a fondo, y sí, cualquier cosa en esta área va a ser un truco. Intenté varias formas de determinar el tiempo de descarga y, de manera consistente, me llevó> 10 ms si no era un hit almacenado en caché y menos de <10ms si era FWIW. – pseudosavant

0

Otro enfoque que involucra al cliente y al servidor.

  1. Realice una llamada a una página/punto final, que establecerá una identificación única aleatoria en respuesta. Establecer el encabezado de caché para esta página/punto final
  2. Hacer la misma llamada de nuevo, que establecerá un número único diferente
  3. Si los números coinciden que viene de caché o se viene desde el servidor
Cuestiones relacionadas