2010-10-01 83 views
7

我只是开始寻找缓存来提高性能,并对缓存AJAX调用有一个问题。ASP.NET MVC缓存如何为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; 
      }); 

这里是我的修改操作:

[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); 
     } 

回答

11

下面是它如何工作的:假设没有在服务器端指定缓存,默认除非您在发送AJAX请求时指定cache: true属性,否则浏览器将缓存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秒钟后,缓存将过期并重复相同的过程。

+0

因此,当用户在我的情况下点击更多数据时,它会一次又一次返回前10个结果,直到缓存过期结束?在这种情况下,我可能不想使用缓存,因为当他们点击更多的数据时,它不能被缓存 – Jon 2010-10-01 20:03:39

+0

@Jon,你可以使用'VaryByParam'属性来指定一个动作参数名称,例如页码。 – 2010-10-02 08:49:36

+0

Can VaryByParam可以包含一个CSV值,例如/如果您有5个页码? – Jon 2010-10-02 10:00:07