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

Ada*_*own 6 http-caching asp.net-mvc-3

我在使用Microsoft的MVC3框架中的OutputCache属性时遇到了问题.

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

public JsonResult GetProducts(long manufacturerId)
{
    return Json(this.CreateProductList(manufacturerId), JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

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

[OutputCache(Duration = 3600, Location = OutputCacheLocation.Server, VaryByParam = "manufacturerId")]
Run Code Online (Sandbox Code Playgroud)

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

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

通过将OutputCache更改为:我可以实现这一点:

[OutputCache(Duration = 3600, Location = OutputCacheLocation.Client)]
Run Code Online (Sandbox Code Playgroud)

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

我确定这个问题与我在ServerAndClient上获得的"Vary:*"响应头有关,但我不知道如何摆脱它.

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

非常感谢.

PS:这是在本地开发环境,VS2010的IIS Express.

Ale*_*exC 7

您可以使用指定的OutputCacheLocation.Any

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

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

编辑

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

.Net 4 破坏更改的原因详情发布说明.