2010-07-30 116 views
0

我有一個ASPX頁面,使我想要緩存的許多數據庫查詢,以提高應用程序的性能。頁面可以是以下三種狀態之一:OutputCache動態頁面狀態

  1. 等待動態數據。
  2. 顯示動態數據。
  3. 完成顯示動態數據。

動態數據的DateTime存儲在使用「Id」GET參數加載的對象中。我想要的行爲如下。

a>當頁面狀態爲1時,用戶瀏覽到「MyPage.aspx?Id = x」。在第一次加載時,頁面在數據庫中查找,檢索它期望獲取新數據的DateTime,並緩存該頁面直到該日期。

b>用戶在該對象的DateTime(aka,state = 2)後瀏覽到「MyPage.aspx?Id = x」。在第一次加載時,由於緩存已過期,頁面會動態生成並顯示最新的數據庫數據。該頁面被緩存30秒以提高後續用戶的性能。

c>狀態更改爲3後,用戶瀏覽到「MyPage.aspx?Id = x」。頁面現在不會更改,因此沒有必要繼續查看數據庫。緩存設置爲在一個月內過期(如果可能,永不過期)。

我試圖做到這一點用下面的代碼(我的狀態被稱爲「待定」,「INPROGRESS」和「完成」):

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

我不知道,如果這做什麼,我期待它。我用FireBug測試了它,並且Cache-Control頭設置爲「no-cache」,並且高速緩存的過期日期設置爲「Wed Dec 31 1969 18:00:00 GMT-0600(Central Standard Time)」 。當我註釋掉上面的Response.Cache行時,緩存控制頭設置爲「private」,並且緩存的有效日期被設置爲與上面相同。

任何想法我在這裏做錯了或如何更好地測試它?

謝謝!

回答

0

原來緩存正在工作。由於緩存設置爲服務器,FireBug沒有選擇它,所以瀏覽器不知道內容被緩存。