2015-05-12 32 views
7

Sto provando a testare la configurazione della cache, voglio che la mia pagina rimanga nella cache per 1 minuto prima che la richiesta raggiunga nuovamente il server.I browser sembrano ignorare le istruzioni di controllo della cache della risposta

Utilizzando questa semplice pagina Test.asp che ha un link a se stesso:

<% Option Explicit %> 
<% 
    Response.Expires = 1 
    Response.CacheControl = "private, max-age=60" 
%> 
<html> 
<head><title>test</title></head> 
<body> 
<% =Now() %> 
<br /> 
<a href="test.asp">test</a> 
</body> 
</html> 

Questo funziona perfettamente sul mio computer di sviluppo http://localhost/test.asp, (cliccando sul link non aggiorna il datetime stampato per 1 min).

Tuttavia non ha l'effetto desiderato quando inserisco la pagina sul server di produzione. Dopo pochi secondi di clic sul collegamento ottengo un nuovo datetime che indica che la richiesta ha raggiunto il server web.

ho usare strumento dev Chrome e vedere queste intestazioni di risposta:

HTTP/1.1 200 OK 
Cache-Control: private, max-age=60 
Content-Type: text/html 
Expires: Tue, 12 May 2015 19:16:52 GMT 
Last-Modified: Tue, 12 May 2015 19:10:00 GMT 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Tue, 12 May 2015 19:15:55 GMT 
Content-Length: 205 

Qualcuno può aiutare a spiegare perché non funziona sul server prod?

aggiornamento ho provato con Chrome, Firefox e IE, e anche 2 pagine Test.asp e Test2.asp, avendo un collegamento alla altra pagina, ed entrambi hanno dato esattamente lo stesso problema, dopo 8-12 sec , la pagina si aggiorna invece di aspettare 60 secondi prima di aggiornare.

+0

Come stai testando? Aggiorna nella stessa scheda? Questo potrebbe essere un problema di Chrome: http://stackoverflow.com/questions/11245767/is-chrome-ignoring-control-cache-max-age Il motivo per cui ha funzionato sul tuo ambiente di sviluppo potrebbe essere che Chrome fa cose strane con il url 'localhost' comunque .. – AardVark71

+0

Sto testando cliccando sul collegamento ipertestuale nella pagina di test che si collega a se stesso. L'utilizzo del pulsante di aggiornamento invia sempre la richiesta al server che è logica. Proverò con altri browser e forse anche più di una pagina. – Jonathan

+0

Ottimo! ora che ho appena iniziato una taglia e provato di nuovo lo stesso codice, il problema è semplicemente scomparso magicamente, che diamine: | – Jonathan

risposta

0

Per dare seguito al mio commento, sembra che si stia cercando di memorizzare nella cache le pagine ASP din sul server, non sul client. Il caching sul client non ti fa davvero molto bene perché i moderni browser/proxy richiedono comunque l'articolo quando è un documento HTML. Memorizzando nella cache le risorse statiche che non cambiano come immagini, css, js dovrebbe funzionare e, a seconda dell'intestazione della cache che si spinge, il browser le rispetterà.

Per ottenere le pagine in cache sul server (ovvero IIS non deve rigenerare la pagina) ecco come lo si fa.

web.config

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <caching> 
      <profiles> 
       <add extension=".asp" policy="CacheForTimePeriod" kernelCachePolicy="DontCache" duration="00:01:00" /> 
      </profiles> 
     </caching> 
    </system.webServer> 
</configuration> 

È possibile inserire il vostro web.config in una directory specifica solo per memorizzare nella cache il contenuto, si può anche rompere il caching utilizzando params querystring o determinate intestazioni di richiesta.

+0

Non riesco a utilizzare facilmente la cache di output di IIS, perché è il caching privato (il contenuto della pagina varia per ogni utente). Hai detto: "La memorizzazione nella cache del client non ti fa davvero molto bene perché i browser/proxy moderni richiedono comunque l'articolo quando è un documento HTML" Puoi spiegarci di più? Perché i browser richiederebbero il server se le intestazioni di risposta della cache client sono impostate correttamente? – Jonathan

+0

È possibile utilizzare la memorizzazione nella cache di iis-output e variare in base a param, è inoltre possibile variare in base a valori di intestazione diversi che è possibile inviare autonomamente negli script asp, oppure è possibile variare in base all'indirizzo ip. Ma se le tue pagine sono molto diverse, la cache di output su IIS esaurirà le risorse poiché avrai troppe versioni di ciascuna pagina in memoria> Come per il mio commento precedente, l'unica volta che ottengo una risposta di Cache è per articoli statici (immagini, js, css). Per il content-type html chrome sembra richiedere sempre la pagina. Non so perché, ho lo stesso comportamento su Nginx e IIS – Frank