我有一個ASPX頁面,使我想要緩存的許多數據庫查詢,以提高應用程序的性能。頁面可以是以下三種狀態之一:OutputCache動態頁面狀態
- 等待動態數據。
- 顯示動態數據。
- 完成顯示動態數據。
動態數據的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」,並且緩存的有效日期被設置爲與上面相同。
任何想法我在這裏做錯了或如何更好地測試它?
謝謝!