在我工作的公司中,我们有一个使用ASP.NET MVC2开发并托管在IIS7上的Web应用程序。
在特定操作中,我们返回一个包含数组的JsonResult对象。这个数组每天更新;所以在同一天发出的任何请求都会得到相同的回复。
public ActionResult SomeAction(int id)
{
// Some calculations
return Json(resultArray, JsonRequestBehavior.AllowGet);
}
由于操作成本很高,我们希望通过浏览器缓存来提高性能。
我添加了一个缓存标头,因此我们告诉用户浏览器将结果缓存到下一次更新数据库。
除此之外,我想添加一个“Last-Modified”标题,因此浏览器会询问是否在指定日期之后修改了源。
实现这一目标的方法是什么?我想检查数据库是否在日期浏览器询问后被修改(Last-Modified标头),如果没有修改,我想返回304只是IIS自动为静态文件(图像,css和js文件等)做了
答案 0 :(得分:3)
添加真实的Last-Modified
标头。如果您的数据每天更新,您应该知道何时,对吧?
然后,在action方法的开头,通过解析HTTP请求中的datetime字符串并检查数据的实际上次修改时间来添加对传入If-Modified-Since
的检查。如果数据尚未修改,则只需return 304 manually。如果有,请执行操作方法通常执行的操作。
您也可以(或者代之)向您的内容返回ETag,其内容必须随着内容的变化而改变。
然后将整个内容包装为ASP.NET MVC Action Filter以获得可重用性。
然后post about it on your blog. :)
为了防止行为不当的客户端和不缓存任何内容的客户端(可能是由应用程序而不是桌面浏览器加载数据),您可以将操作方法的结果存储在ASP.NET输出缓存中,避免昂贵的操作。你可能会have to VaryByCustom
实现绝对过期。