我有一个 ASPX 页面,它会进行大量数据库查询,我试图缓存这些查询以提高应用程序的性能。页面可以是以下三种状态之一:
- 等待动态数据。
- 显示动态数据。
- 完成显示动态数据。
动态数据的 DateTime 存储在您使用“Id”GET 参数加载的对象中。我希望行为如下。
a> 当页面状态为 1 时,用户浏览到“MyPage.aspx?Id=x”。第一次加载时,页面在数据库中查找,检索它期望获取新数据的 DateTime,并缓存页面直到日期。
b> 用户在该对象的 DateTime 之后浏览到“MyPage.aspx?Id=x”(又名,状态 = 2)。首次加载时,由于缓存已过期,页面会动态生成并显示最新的数据库数据。该页面缓存 30 秒以提高后续用户的性能。
c> 用户在状态变为 3 后浏览到“MyPage.aspx?Id=x”。页面现在永远不会改变,所以没有必要继续在数据库中查找。缓存设置为在一个月内过期(或永不过期,如果可能的话)。
我尝试使用以下代码执行此操作(我的状态称为“Pending”、“InProgress”和“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");
我不确定这是否符合我的预期。我已经使用 FireBug 对其进行了测试,并且 Cache-Control 标头设置为“no-cache”,并且缓存的过期日期设置为“Wed Dec 31 1969 18:00:00 GMT-0600(Central Standard Time)” . 当我注释掉上面的 Response.Cache 行时,缓存控制标头设置为“私有”,并且缓存的到期日期设置为与上面相同。
任何想法我在这里做错了什么或如何更好地测试它?
谢谢!