Отладка AJAX-кэширования в ASP.NET MVC - PullRequest
0 голосов
/ 26 февраля 2010

У меня есть простое доказательство концепции, которая, кажется, странно обрабатывает кеширование. Вот мнение:

<script>       
$('#clickToLoad').click(function() {
    $.ajax({
        url: "<%=ResolveUrl("~/Home/AjaxCacheTest") %>?"
        , dataType: 'json'
            ,ifModified: true
            ,cache: true
        ,success: function(sourceData) {
        }
    });
});
</script>

Это связано с действием в контроллере:

[OutputCache(VaryByParam = "none", Duration = 3000)]
public ContentResult AjaxCacheTest()
{
    return Content("0", "application/json");
}

Я бы хотел получить результат с кешированием, однако, похоже, что AjaxCacheTest не кеширует, если я не запрашиваю его самостоятельно (то есть в окне браузера вместо AJAX).

Установка кеша: true не помогает. Установка ifModified: true вызывает кеширование, но затем не вызывает функцию успеха, поэтому я не могу использовать результаты.

Существуют ли варианты, позволяющие кэшировать и при этом вызывать ответный обратный вызов?

UPDATE: Спасибо, забыл добавить те. Я тестирую с помощью firebug и определяю, как кеширование обрабатывается комбинацией просмотра кода ответа (200 OK против 302) и времени ответа на запрос. Это все на встроенном сервере Visual Studio (Кассини?).

1 Ответ

2 голосов
/ 26 февраля 2010

Вот как работает кэширование в вашем сценарии. Предположим, вы определили следующее действие

[OutputCache(VaryByParam = "none", Duration = 5)]
public ActionResult AjaxCache()
{
    return Json(new { date = DateTime.Now }, JsonRequestBehavior.AllowGet);
}

Если вы явно не установите атрибут Location , по умолчанию будет OutputCacheLocation.Any , что означает:

Кэш вывода может быть расположен на браузерный клиент (где запрос возникла), на прокси-сервере (или любой другой сервер), участвующий в запрос или на сервере, где запрос был обработан. Это значение соответствует HttpCacheability.Public перечисление значение.

Duration = 5 означает, что содержимое будет кэшироваться в течение 5 секунд. Далее вы отправляете запрос ajax:

<%= Html.ActionLink("cache test", "AjaxCache") %>

<script type="text/javascript">
$(function() {
    $('a').click(function() {
        $.ajax({ url: this.href,
            success: function(json) {
                $('#result').html(json.date);
            }
        });        
        return false;
    });
});
</script>

<div id="result"></div>

Если дважды щелкнуть ссылку в течение 5 секунд, вы увидите, что результат div не изменится, не будет выполнено действие сервера, но всегда будет выполняться обратный вызов success. Сервер отправляет следующие заголовки:

Cache-Control: public, max-age=5
Expires: Fri, 26 Feb 2010 14:09:02 GMT
Last-Modified: Fri, 26 Feb 2010 14:08:57 GMT
Vary: *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...