2010-06-08 3 views
4

J'ai un fichier CSS généré dynamiquement. C'est assez grand et a un contenu différent pour les différents navigateurs. Cela change très rarement.Pourquoi mes pages aspx ne sont-elles pas mises en cache sur le client?

Ainsi, en haut de la .aspx la page je:

<%@ OutputCache Duration="86400" 
       Location="ServerAndClient" 
       VaryByParam="none" 
       VaryByCustom="browser" %> 

J'ai une directive similaire contre les actions MVC qui génèrent des images dynamiques:

[OutputCache(Duration = 86400, 
      VaryByParam = "none", 
      Location = OutputCacheLocation.ServerAndClient)] 

Cela devrait se traduire par le fichier mise en mémoire cache sur le serveur et le client (mais pas les intermédiaires intermédiaires) pour une journée.

Les en-têtes de réponse semblent corrects:

HTTP/1.1 200 OK 
Cache-Control: private, max-age=83831 
Content-Type: text/css; charset=utf-8 
Expires: Wed, 09 Jun 2010 08:52:45 GMT 
Last-Modified: Tue, 08 Jun 2010 08:52:45 GMT 
Vary: * 
Server: Microsoft-IIS/7.0 
X-AspNet-Version: 2.0.50727 
X-Powered-By: ASP.NET 
Date: Tue, 08 Jun 2010 09:35:34 GMT 
Content-Length: 70073 

La mise en cache fonctionne côté serveur - autres requêtes n'exécutent pas le code.

Toutefois, la mise en cache côté client est rompue de deux manières différentes: tout d'abord, le contenu est à nouveau demandé sur chaque page, en dépit du fait qu'il doit être mis en cache.

Pourquoi le navigateur demande-t-il de nouveau le contenu?

Deuxièmement, lorsque le serveur demande de nouveau le contenu, il renvoie un HTTP 200 ainsi que tout le contenu. Il doit renvoyer un HTTP 304 non modifié sans indiquer au navigateur de réutiliser ce qu'il a déjà téléchargé.

Comment puis-je m'assurer qu'il renvoie un HTTP 304 lorsque le contenu n'a pas changé?

Répondre

4

1) Varier: * provoquera la fermeture de certains navigateurs, tels que IE. Varier: User-Agent pourrait mieux fonctionner (pas sûr).

2) WRT 200 contre 304: le client envoie-t-il un en-tête If- *?

+1

Cheers - ressemble que 'varient: *' tête était la raison pour laquelle IE n'a pas cache fixe en ajoutant '' sur le Web (encore un autre bug IE!) .config – Keith

+0

Le client n'envoie pas d'en-tête de requête 'If-None-Match' - probablement parce qu'il n'y a pas de' ETag' dans la réponse. – Keith

+1

Il pourrait envoyer un If-Modified-Since, mais bien sûr fournir un ETag est préférable de toute façon. –

Questions connexes