MVC3的OutputCache没有服务器和客户机上按预期工作(MVC3 OutputCache n

2019-07-31 02:39发布

我在使用微软的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)]

这里的问题:我怎么组合这些,这样我可以有两套行为? 我尝试设置位置,以ServerAndClient但这只是表现行为相同,当位置是服务器。

我敢肯定,这个问题有什么做的“有所不同:*”响应头我ServerAndClient得到,但我不知道如何摆脱它。

我欢迎对我的意图的合理性意见 - 这我没有得到我希望让我觉得我可能有一些根本性的误解某处结果的事实......

非常感谢。

PS:这是在本地开发环境,IIS快递从VS2010。

Answer 1:

您可以使用OutputCacheLocation.Any指定

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

您可能要缓存控制公众对这些请求的HTTP标头也设置。

编辑

看来,这取决于Web服务器的.NET版本,您可能需要包括Response.Cache.SetOmitVaryStar(true); 你的控制器动作,除去内会发生变化*头为你的建议。

原因为何细节.NET 4名的重大更改发行说明 。



文章来源: MVC3 OutputCache not working on Server and Client as expected