【发布时间】:2016-01-28 21:01:08
【问题描述】:
谁能解释我如何在 MVC 5 应用程序中实现 JsonResult 动作的缓存?
我想使用[OutputCache()] 属性缓存一些ajax 调用的动作。其中一些操作返回带有html-content 的ActionResult,一些带有{Id, Title} 对的序列化列表的JsonResult,我将使用它们来构建下拉列表。
我的目标是减少 DB 查询(在构建 ViewModel 时)和服务器请求(在使用 ajax 调用时)。
所以,我的代码如下所示:
[OutputCache(Duration=60*60*24)]
public async Task<ActionResult> SearchCaseOrgDialog(){
//extract data return html page
return View();
}
[OutputCache(Duration=60*60*24)]
public async Task<JsonResult> AjaxOrgDepartments(){
//query database, serialize data, return json
var result = await ctx.OrgDepartments
.Select(d => new {
Id = d.Id,
Title = d.Title }
)
.ToListAsync();
return Json(result, JsonRequestBehavior.AllowGet);
}
当我查看 FireFox 工具面板时,我看到了 Html-content 的下一张图片:
这里 Firefox 使用客户端缓存版本的 ajax-requested 页面。
它不缓存内容,并且似乎从服务器传输数据(服务器端缓存)。
在这两种情况下,响应标头看起来都一样:
Cache-Control:"public, max-age=86400, s-maxage=0"
使用类似的ajax-calls 来请求内容
$.get(url, null, function(data){
//do something with data
});
那么,如何缓存 json-content?什么是正确的方法,为什么默认方法不起作用?
【问题讨论】:
-
其他浏览器是否尊重缓存头?似乎 FF 对 AJAX 请求忽略了这一点。您还可以使用 ObjectCache (
HttpContext.Current.Cache) 来存储查询的结果。 -
@Jasen,实际上当我直接在浏览器中打开链接(没有
ajax)时,结果是一样的。在 Chrome 中的情况看起来也类似 -
@Edward 在那个问题中存在服务器端缓存问题。在我的情况下,服务器端缓存效果很好。客户端有问题:浏览器询问服务器并获取缓存的服务器结果,但它不使用自己的缓存
标签: json ajax asp.net-mvc caching asp.net-mvc-5