使用HTTP304状态代码的ASP.NET MVC2浏览器缓存

时间:2011-10-02 21:37:51

标签: asp.net asp.net-mvc-2 browser-cache http-status-code-304

在我工作的公司中,我们有一个使用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文件等)做了

1 个答案:

答案 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实现绝对过期。