6

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

请想象以下控制器操作,它可以用作 AJAX 调用的一部分,以获取基于特定制造商 ID 的产品列表:

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)]

问题来了:我如何将这些结合起来,以便我可以同时拥有两组行为?我尝试将位置设置为 ServerAndClient,但这只是使其行为与位置为服务器时相同。

我确定问题与我使用 ServerAndClient 获得的“Vary: *”响应标头有关,但我不知道如何摆脱它。

我欢迎对我的意图的合理性发表评论——事实上我没有得到我期望的结果,这让我觉得我可能在某个地方有一些根本性的误解......

非常感谢。

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

4

1 回答 1

8

您可以使用 OutputCacheLocation.Any 指定

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

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

编辑

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

.Net 4重大更改发行说明中的​​原因的详细信息。

于 2012-08-21T09:55:51.977 回答