【问题标题】:MVC3 OutputCache not working on Server and Client as expectedMVC3 OutputCache 未按预期在服务器和客户端上工作
【发布时间】:2012-08-16 15:31:47
【问题描述】:

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

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

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

我欢迎 cmets 关于我意图的合理性 - 我没有得到我期望的结果这一事实让我认为我可能在某个地方存在一些根本性的误解......

非常感谢。

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用 OutputCacheLocation.Any 指定

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

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

    编辑

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

    .Net 4 breaking changes release notes 中的原因详情。

    【讨论】:

    • 谢谢亚历克斯,但恐怕这仍然与将其设置为“服务器”具有相同的效果;客户端仍然发出请求,只是获取缓存的版本。我正在查看 fiddler 中的标头,似乎每当我在 Location 中包含除 Client 以外的任何内容时,我都会在响应标头中得到“Vary:*”,这会导致浏览器忽略其本地缓存...
    • 这是在真正的 IIS 机器上还是在开发机器上?
    • 对不起,我忘了补充:这是一个开发环境,来自 VS2010 的 IIS Express
    • 谢谢! Response.Cache.SetOmitVaryStar(true); 成功了。它现在可以按照我想要的方式工作。
    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多