OutputCache для динамических страниц с состоянием - PullRequest
0 голосов
/ 30 июля 2010

У меня есть страница ASPX, которая выполняет множество запросов к базе данных, которые я пытаюсь кэшировать, чтобы улучшить производительность приложения.Страница может иметь одно из трех состояний:

  1. Ожидание динамических данных.
  2. Отображение динамических данных.
  3. Завершение отображения динамических данных.

DateTime для динамических данных сохраняется в объекте, который вы загружаете с помощью параметра GET «Id».Я хочу, чтобы поведение было следующим:

a> Пользователь просматривает «MyPage.aspx? Id = x», когда состояние страницы равно 1. При первой загрузке страница просматривает базу данных, получаетDateTime ожидает получения новых данных и кэширует страницу до этой даты.

b> Пользователь просматривает «MyPage.aspx? Id = x» после DateTime для этого объекта (иначе, состояние = 2),При первой загрузке, поскольку срок действия кэша истек, страница генерируется динамически и показывает последние данные базы данных.Страница кэшируется в течение 30 секунд для повышения производительности для последующих пользователей.

c> Пользователь переходит к «MyPage.aspx? Id = x» после изменения состояния на 3. Страница теперь никогда не изменитсятак что нет смысла искать в базе данных.Срок действия кэша истекает через месяц (или никогда не истекает, если это возможно).

Я пытался сделать это с помощью следующего кода (мои состояния называются «В ожидании», «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, приведенные выше, заголовок элемента управления кэшем имеет значение «private», а дата окончания срока действия кэша устанавливается такой же, как указано выше.что тут не так или как проверить лучше?

Спасибо!

1 Ответ

0 голосов
/ 09 сентября 2010

Оказывается, кеширование работало.FireBug не поднял его, потому что кеширование было установлено на сервер, поэтому браузер не знает, что содержимое кэшируется.

...