2008-12-13 7 views
0

J'ai une page ASPX, mais tout le contenu est généré par les mains (oui je sais que je dois faire un gestionnaire, j'ai une autre question)problème avec la mise en cache

Je veux un cache de sortie dans le navigateur client. Le problème est qu'il est mis en cache uniquement pour une requête.

 public static void ProceedCaching(string etag, string lastModify, string response, HttpResponse Response, 
             HttpRequest Request) 
    { 
     Response.AddHeader("ETag", "\"" + etag + "\""); 
     Response.AddHeader("Last-Modified", lastModify); 
     Response.AppendHeader("Cache-Control", "Public"); 
     Response.AppendHeader("Expires", 
           DateTime.Now.AddMinutes(1).ToUniversalTime().ToString("r",DateTimeFormatInfo.InvariantInfo)); 

     string ifModified = Request.Headers["If-Modified-Since"]; 

     if (!string.IsNullOrEmpty(ifModified)) 
     { 
      if (ifModified.Contains(";")) 
       ifModified = ifModified.Remove(ifModified.IndexOf(';')); 
     } 

     string incomingEtag = Request.Headers["If-None-Match"]; 

     if (String.Compare(incomingEtag, etag) == 0 || string.Compare(ifModified, lastModify) == 0) 
     { 
      Response.StatusCode = 304; 
      Response.End(); 
     } 

     Response.Write(response); 
     Response.End(); 
    } 

est devenu compliqué. Comme je l'ai dit, il est mis en cache qu'une seule fois. Après réception, le navigateur HTTP 304 enverra une requête propre sans mise en cache des informations (etag, lastmodified). Vous avez des idées?

Répondre

0

trouvé cette réponse here

D'une manière générale, ce sont des règles les plus courantes qui sont suivies (ne vous inquiétez pas si vous ne comprenez pas les détails, il sera expliqué ci-dessous):

  1. Si les en-têtes de la réponse indiquent au cache de ne pas le conserver, ce n'est pas le cas.
  2. Si la demande est authentifiée ou sécurisée, elle ne sera pas mise en cache.
  3. Si aucun validateur (un ETag ou Last-Modified tête) est présent sur une réponse, et il n'a pas de fraîcheur des informations explicite, il sera considéré comme uncacheable.
  4. Une représentation mises en cache est considéré comme frais (qui est en mesure d'être envoyé à un client sans vérifier avec le serveur d'origine ) si:
    • Il a un temps d'expiration ou autre tête contrôle âge définir, et est toujours dans la période fraîche .
    • Si un cache de navigateur a déjà vu la représentation, et a été configuré pour vérifier une fois une session.
    • Si un cache proxy a vu la représentation récemment, il a été modifié il y a relativement longtemps. Les représentations fraîches sont servies directement à partir du cache , sans vérification avec le serveur d'origine.
  5. Si une représentation est obsolète, le serveur d'origine seront invités à valider ou dire le cache si la copie qu'il a est toujours bon.

Et Microsoft a un bon article si vous ne voulez pas qu'il cache.

0

Votre extrait de code fonctionne très bien si je supprime les guillemets que vous ajoutez autour de l'etag en première ligne. Mais je devine que c'est juste une erreur dans l'extrait, et pas le vrai problème que vous rencontrez.

Firefox 3 n'a même pas la peine de frapper le serveur après avoir reçu le premier 304. IE7 continue, mais il envoie correctement les en-têtes lastmod/etag et reçoit un 304 à chaque fois.

Etes-vous sûr que ce n'est pas parce que vous avez modifié les paramètres de mise en cache dans votre navigateur? Je voudrais l'essayer dans un autre navigateur pour être sûr. Pour le rendre un peu plus propre, vous pouvez utiliser les méthodes sur Response.Caching au lieu de définir directement les en-têtes.

+0

désolé pour mon absence (je suis en vacances) je pense que vous avez raison. problème dans les citations – AlfeG

Questions connexes