Как работает кэширование ASP.NET MVC для AJAX-запроса? - PullRequest
8 голосов
/ 01 октября 2010

Я только начинаю изучать кэширование для повышения производительности и у меня возникает вопрос о кэшировании для вызова AJAX.

У меня есть действие, которое используется для запроса в Твиттере, а затем возвращает результаты.В тот момент, когда пользователь нажимает кнопку, он загружает вращающийся gif-файл, а затем переходит к действию, чтобы выполнить запрос, а затем возвращает частичное представление.Затем jQuery обновляет div с ответом HTML из представления.Обычно это занимает около 5 секунд.Затем у них есть дополнительная кнопка, которая срабатывает, чтобы получить больше результатов.

Что произойдет, если я наложу атрибут CachingAttribute поверх этого действия?Я знаю, что могу попробовать, но я просто хочу объяснить техническую сторону вещей.

Спасибо

Вот мой Javascript:

$('#blogEntryList #moreLink').live("click", function() {


                $('#morespan').toggle();
                $('#loader').toggle();

                $.get($(this).attr("href"), function(response) {
                    $('#blogEntryList ol').append($("ol", response).html());
                    $('#blogEntryList #moreLink').replaceWith($("#moreLink", response));
                    $('#loader').hide();
                    $('#morespan').show();
                });
                return false;
            });

Вот мое модифицированное действие:

[OutputCache(
    Location = OutputCacheLocation.Server,
    Duration = 100,
    VaryByParam = "")]
        public ActionResult BlogPosts(int? entryCount)
        {
            if (!entryCount.HasValue)
                entryCount = defaultEntryCount;

            int page = entryCount.Value / defaultEntryCount;

            IEnumerable<BlogData> pagedEntries = GetLatestEntries(page, defaultEntryCount);

            if (entryCount < totalItems)
                AddMoreUrlToViewData(entryCount.Value);

            return View("BlogEntries", pagedEntries);
        }

1 Ответ

12 голосов
/ 01 октября 2010

Вот как это работает: при условии, что на стороне сервера не указано кэширование, по умолчанию GET-запросы будут кэшироваться браузером, а POST-запросы не кэшируются, если только вы не укажете атрибут cache: true при отправке AJAX-запросов, который позволяет переопределять стратегия кэширования клиента.

Теперь на стороне сервера вы можете украсить действие вашего контроллера с помощью [OutputCache] что позволит вам определить различные стратегии кэширования. Вы можете хранить кэш на сервере, прокси-серверах нижестоящего уровня или на клиенте. Вы также можете управлять различными политиками истечения срока действия.

Итак, давайте проиллюстрируем это на примере:

[OutputCache(
    Location = OutputCacheLocation.Server, 
    Duration = 10,
    VaryByParam = "")]
public ActionResult Hello()
{
    return Content(DateTime.Now.ToLongTimeString(), "text/plain");
}

А на стороне клиента:

$.ajax({
    url: '/home/hello',
    type: 'post',
    success: function (result) {
        alert(result);
    }
});

Результат этого действия контроллера будет кэшироваться на сервере в течение 10 секунд. Это означает, что сервер будет попадать при каждом запросе, но действие не будет выполнено, если существует кэшированная версия и будет напрямую обслуживаться из этого кэша. Через 10 секунд после первого запроса, который выполнил действие контроллера, срок действия кэша истечет, и тот же процесс повторяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...