代码之家  ›  专栏  ›  技术社区  ›  Jon

你怎么知道的ASP.NETMVC缓存对AJAX请求有效吗?

  •  8
  • Jon  · 技术社区  · 14 年前

    我刚刚开始研究缓存以提高性能,并对AJAX调用的缓存提出了一个问题。

    我有一个操作,用于查询twitter,然后返回结果。当用户按下一个按钮时,它加载一个旋转的gif,同时执行查询操作,然后返回一个局部视图。jQuery然后用视图中的HTML响应更新div。通常这需要5秒左右。然后他们会有一个“更多”按钮,它会关闭以获得更多结果。

    如果我对这次行动大加赞扬会怎么样?我知道我可以试试,但我只想解释一下技术方面的问题。

    谢谢

    以下是我的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 回复  |  直到 14 年前
        1
  •  12
  •   Darin Dimitrov    14 年前

    工作原理如下:假设服务器端没有指定缓存,默认情况下,GET请求将由浏览器缓存,POST请求则不会缓存,除非指定 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秒后,缓存将过期,并且相同的过程将重复。