2

在我工作的公司ASP.NET MVC2浏览器缓存,我们有一个ASP.NET MVC2开发和IIS7托管的Web应用程序。与HTTP304状态代码

在一个特定的行动,我们返回一个JsonResult物体保持的阵列。此数组每天更新;所以任何来自同一天的请求都会以相同的响应结束。

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

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

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

除此之外,我想添加一个“的Last-Modified”头,所以浏览器会询问如果电源是在指定日期之后修改。

完成这个的方法是什么?我想检查日期浏览器询问(Last-Modified标题)后数据库是否被修改,如果没有修改,我想返回304只是IIS自动为静态文件(图像,css和js文件等)做的

+0

[你知道输出缓存的属性吧?](http://msdn.microsoft.com/en-us/library/system.web.mvc.outputcacheattribute.aspx) – bzlm

+0

是的,但outputcache属性需要编译时间定义的持续时间,我需要在运行时检查数据库的最后修改日期。 – SadullahCeran

+0

没错。但是,你真正的问题是什么?这听起来像你有一切想通了。如果你设置了Expires和Last-Modified以及Cache-Control的东西,那么不是所有东西都可以工作吗? – bzlm

回答

3

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

然后,在操作方法的开始处,通过解析HTTP请求中的该日期时间字符串并检查数据的实际上次修改时间来检查传入的If-Modified-Since。如果数据没有被修改,只需要return 304 manually。如果有的话,做一下行动方法通常会做的事情。

你也可以(或替代)与您的内容返回ETag,那么它的值必须改变每当内容变化。

然后包裹了整个事情了作为ASP.NET MVC Action Filter的可重用性。

然后post about it on your blog. :)

为了防止行为不端的客户,谁不缓存任何客户端(也许你的数据是由应用程序,而不是一个桌面浏览器加载),你可以存储在操作方法的结果无论如何ASP.NET输出缓存,以避免代价高昂的操作。你可能会用have to VaryByCustom来实现绝对期满。

+0

感谢您的回答:)我首先通过您提供的链接访问了58位,您是博客文章的作者吗?我只是好奇。 – SadullahCeran

+0

没有。它看起来与你需要的相似。 – bzlm