2

在我工作的公司中,我们有一个使用 ASP.NET MVC2 开发并托管在 IIS7 上的 Web 应用程序。

在特定操作中,我们返回一个包含数组的 JsonResult 对象。该数组每天更新;因此,同一天发出的任何请求都会得到相同的响应。

public ActionResult SomeAction(int id)
{
    // Some calculations
    return Json(resultArray, JsonRequestBehavior.AllowGet);
}

由于操作成本高昂,我们希望通过浏览器缓存等来提高性能。

我添加了一个缓存头,所以我们告诉用户浏览器缓存结果,直到数据库的下一次更新。

除此之外,我想添加一个“Last-Modified”标题,所以浏览器会询问源是否在指定日期之后被修改。

实现它的方法是什么?我想检查在浏览器询问的日期(Last-Modified 标头)之后是否修改了 DB,如果没有修改,我想返回 304,只是 IIS 自动对静态文件(图像、css 和 js 文件等)执行

4

1 回答 1

3

添加一个真实的Last-Modified标题。如果您的数据每天更新,您应该知道什么时候更新,对吗?

然后,在操作方法的开头,If-Modified-Since通过解析 HTTP 请求中的日期时间字符串并检查数据的实际最后修改时间来添加对传入的检查。如果数据没有被修改,只需手动返回 304即可。如果有,请执行 action 方法通常执行的操作。

您也可以(或相反)返回一个包含您的内容的ETag,其值必须在内容更改时随之更改。

然后将整个事情包装成一个ASP.NET MVC 动作过滤器以实现可重用性。

然后在你的博客上发布它。:)

为了防止行为不端的客户端和不缓存任何内容的客户端(可能您的数据由应用程序而不是桌面浏览器加载),您可以将操作方法​​的结果存储在 ASP.NET 输出缓存中,以避免昂贵的操作。不过,您可能必须VaryByCustom实施绝对到期。 

于 2011-10-02T22:10:33.067 回答