2010-07-30 5 views
0

J'ai une page ASPX qui fait beaucoup de requêtes de base de données que je tente de mettre en cache pour améliorer les performances de l'application. La page peut avoir l'un des trois états suivants:OutputCache pour les pages dynamiques avec l'état

  1. En attente de données dynamiques.
  2. Affichage de données dynamiques.
  3. Terminé affichant des données dynamiques.

Le DateTime pour les données dynamiques est stocké dans l'objet que vous chargez avec le paramètre "Id" GET. Je veux que le comportement soit comme suit. A> L'utilisateur navigue jusqu'à "MyPage.aspx? Id = x" lorsque l'état de la page est 1. Au premier chargement, la page regarde dans la base de données, récupère le DateTime attend de nouvelles données, et les caches la page jusqu'à cette date. B> L'utilisateur navigue jusqu'à "MyPage.aspx? Id = x" après le DateTime pour cet objet (aka, state = 2). Lors du premier chargement, puisque le cache a expiré, la page est générée dynamiquement et affiche les dernières données de base de données. La page est mise en cache pendant 30 secondes pour améliorer les performances pour les utilisateurs suivants. C> L'utilisateur navigue jusqu'à "MyPage.aspx? Id = x" après que l'état est passé à 3. La page ne va plus jamais changer, donc il ne sert à rien de continuer à chercher dans la base de données. Le cache est défini pour expirer dans un mois (ou n'expire jamais, si c'est possible).

J'ai essayé de le faire avec le code suivant (mes états sont appelés « En attente », « InProgress » et « Complete »):

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Request.QueryString["Id"] != null) 
    { 
     int id = Convert.ToInt32(Request.QueryString["Id"]); 
     // load object into var 'm' 

     // set up controls using information from DB (all DB work is abstracted to the class of 'm' 

     if (m.Status == Status.Pending) 
     { 
      Response.Cache.SetExpires(m.Date); 
      Response.Cache.VaryByParams["Id"] = true; 
      Response.Cache.SetCacheability(HttpCacheability.Server); 
      Response.Cache.SetValidUntilExpires(true); 

      // do other stuff related to pending 
     } 
     else if (m.Status == Status.InProgress) 
     { 
      Response.Cache.SetExpires(DateTime.Now.AddSeconds(30)); 
      Response.Cache.VaryByParams["Id"] = true; 
      Response.Cache.SetCacheability(HttpCacheability.Server); 
      Response.Cache.SetValidUntilExpires(true); 

      // do other stuff related to in progress 
     } 
     else 
     { 
      // completed 
      Response.Cache.SetExpires(DateTime.Now.AddMonths(1)); 
      Response.Cache.VaryByParams["Id"] = true; 
      Response.Cache.SetCacheability(HttpCacheability.Server); 
      Response.Cache.SetValidUntilExpires(true); 

      // do other stuff related to completed 
     } 

     // load data into page (uses additional database calls) 
    } 
    else 
     Response.Redirect("~/Default.aspx"); 

Je ne sais pas si cela fait ce que je Attendez-vous à. Je l'ai testé avec FireBug et l'en-tête Cache-Control est défini sur "no-cache" et la date d'expiration du cache est définie sur "Wed Dec 31 1969 18:00:00 GMT-0600 (Central Standard Time)" . Lorsque je commente les lignes Response.Cache ci-dessus, l'en-tête de contrôle de cache est défini sur "privé" et la date d'expiration du cache est définie sur la même que ci-dessus.

Des idées de ce que je fais mal ici ou comment le tester mieux?

Merci!

Répondre

0

Il s'avère que la mise en cache fonctionnait. FireBug ne l'a pas détecté car la mise en cache était définie sur le serveur, de sorte que le navigateur ne sait pas que le contenu est mis en cache.

Questions connexes