【问题标题】:ASP.NET MVC2 Browser caching with HTTP304 Status Code带有 HTTP304 状态码的 ASP.NET MVC2 浏览器缓存
【发布时间】:2011-10-02 21:37:51
【问题描述】:

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

【问题讨论】:

  • 是的,但是 outputcache 属性需要编译时定义的持续时间,我需要在运行时检查数据库的最后修改日期。
  • 没错。但你的实际问题是什么?听起来你已经弄清楚了一切。如果你设置了 Expires 和 Last-Modified 以及 Cache-Control 的东西,难道不应该一切正常吗?
  • 我正在成功使用 Expires、MaxAge、Cacheability。但我不知道如何使用 Last-Modified 标头并检查浏览器是否在询问“If-Modified-Since”标头。所以现在,如果浏览器发送带有“If-modified-since”标头的请求,我会以任何方式发送 HTTP200。顺便感谢您的帮助:)

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


【解决方案1】:

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

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

您也可以(或改为)在您的内容中返回 ETag,其值必须在内容发生变化时随之变化。

然后将整个内容包装为 ASP.NET MVC Action Filter 以实现可重用性。

然后post about it on your blog. :)

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

【讨论】:

  • 感谢您的友好回答 :) 我第一次通过您提供的链接访问了 58bits,您是该博客文章的作者吗?我只是想知道。
  • 不。它似乎与您需要的相似。
猜你喜欢
  • 2011-02-22
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多