MVC3 OutputCache无法按预期在Server和Client上运行

时间:2012-08-21 09:50:41

标签: asp.net-mvc-3 http-caching

我在使用Microsoft的MVC3框架中的OutputCache属性时遇到了麻烦。

请设想以下控制器操作,该操作可用作AJAX调用的一部分,以获取基于特定manufacturerId的产品列表:

public JsonResult GetProducts(long manufacturerId)
{
    return Json(this.CreateProductList(manufacturerId), JsonRequestBehavior.AllowGet);
}

我希望将此结果缓存在服务器上,以避免进行过多的数据库查询。我可以通过配置属性来实现这一点:

[OutputCache(Duration = 3600, Location = OutputCacheLocation.Server, VaryByParam = "manufacturerId")]

这符合我的预期 - 浏览器发出一个初始请求,导致服务器创建并缓存结果,来自相同或不同浏览器的后续请求获得缓存版本。

但是......我也希望浏览器在本地缓存这些结果;如果我先在制造商X上过滤,那么Y然后回到X,我不希望它再向X的产品发出请求 - 我希望它只使用它的缓存版本。

我可以通过将OutputCache更改为:

来实现此目的
[OutputCache(Duration = 3600, Location = OutputCacheLocation.Client)]

这是一个问题:如何将这些结合起来以便我可以拥有这两种行为?我尝试将Location设置为ServerAndClient,但这使它的行为与Location is Server时的行为相同。

我确信这个问题与我在ServerAndClient上获得的“Vary:*”响应标题有关,但我不知道如何摆脱它。

我欢迎评论我的意图的合理性 - 事实上我没有得到我期望的结果让我觉得我可能在某处有一些根本的误解......

非常感谢。

PS:这是在本地开发环境中,来自VS2010的IIS Express。

1 个答案:

答案 0 :(得分:7)

您可以使用指定

的OutputCacheLocation.Any
  

输出缓存可以位于浏览器客户端(其中   请求发起),在代理服务器(或任何其他服务器)上   参与请求,或者在请求所在的服务器上   处理。该值对应于HttpCacheability.Public   枚举值。

您可能还想在HTTP标头中为这些请求设置Cache-control public。

编辑

看起来,根据您的.Net版本的Web服务器,您可能需要在控制器操作中包含Response.Cache.SetOmitVaryStar(true);,以便按照您的建议删除Vary *标头。

详细说明.Net 4 breaking changes release notes中的原因。