我刚刚开始研究缓存以提高性能,并对缓存
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); }
解决方法
以下是它的工作原理:假设在服务器端没有指定缓存,默认情况下,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秒后,缓存将过期并重复相同的过程.