我刚刚开始研究缓存以提高性能,并对缓存
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秒后,缓存将过期并重复相同的过程.