ASP.NET MVC如何为AJAX请求进行缓存?

9
我刚开始研究缓存以提高性能,并有一个关于用于 AJAX 调用的缓存的问题。
我有一个操作,用于查询 Twitter 并返回结果。目前,当用户按下按钮时,它会加载一个旋转的 gif,同时跳转到该操作以执行查询,然后返回部分视图。然后 jQuery 会使用 HTML 响应更新 div。通常这需要大约 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;
            });

这是我修改后的Action:

[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
这是它的工作原理:假设没有在服务器端指定缓存,浏览器默认会缓存GET请求,而不缓存POST请求,除非您在发送AJAX请求时指定了cache:true属性,这样可以覆盖客户端的缓存策略。
现在,在服务器端,您可以使用[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秒钟内,缓存将过期,同样的过程会重复。


VaryByParam可以包含一组值的CSV吗? 例如,如果有5个页面数? - Jon
尝试使用分号将参数名称分隔开:VaryByParam="PageNumber;StartPage;Foo;Bar" 或者如果您希望缓存根据每个操作参数组合而有所不同:VaryByParam="*" - Darin Dimitrov
谢谢。我刚刚添加了缓存,但似乎没有缓存任何内容。我已经将我的JavaScript代码添加到了问题中。也许有什么地方出了问题? - Jon
当在服务器上缓存一个操作时,缓存的是该操作的结果。这意味着服务器仍然会被访问,但操作内部的代码不会执行。当然,如果您的服务器很慢,这并没有太大帮助。 - Darin Dimitrov
正如我在答案中提到的,GET请求可能会被浏览器缓存。在这种情况下,甚至不会发送请求到服务器,这可能不是您所期望的。这是IE中GET AJAX请求的常见问题。 - Darin Dimitrov
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接