0

アプリケーションのパフォーマンスを向上させるためにキャッシュしようとしている多くのデータベース クエリを作成する ASPX ページがあります。ページは次の 3 つの状態のいずれかになります。

  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" を参照します。ページは変更されないため、データベースを調べ続ける必要はありません。キャッシュは 1 か月で期限切れになるように設定されています (または、可能であれば期限切れになりません)。

私は次のコードでこれをやろうとしました(私の状態は「保留中」、「進行中」、「完了」と呼ばれています):

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 に答える