0

我有一个 ASPX 页面,它会进行大量数据库查询,我试图缓存这些查询以提高应用程序的性能。页面可以是以下三种状态之一:

  1. 等待动态数据。
  2. 显示动态数据。
  3. 完成显示动态数据。

动态数据的 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 行时,缓存控制标头设置为“私有”,并且缓存的到期日期设置为与上面相同。

任何想法我在这里做错了什么或如何更好地测试它?

谢谢!

4

1 回答 1

0

原来缓存是有效的。FireBug 没有选择它,因为可缓存性设置为服务器,因此浏览器不知道内容已被缓存。

于 2010-09-08T22:58:55.660 回答