ASP.NET MVC中绕过OutputCache

10

我正在我的MVC网站中使用OutputCache属性,如下所示:

[OutputCache(Duration = 5000,
        VaryByParam = "name;region;model;id;op;content;featured;isStarred;page;size;")]

然而,有时我想完全绕过输出缓存并强制从数据库获取数据。这在我的测试环境中尤为重要,因为我不断地将新数据加载到数据库进行测试。

在这种情况下,有没有办法绕过缓存呢?

谢谢。

4个回答

10

不必在属性中指定所有的输出缓存参数,而是可以使用一个OutputCache模板。

输出缓存模板允许您将所有的输出缓存设置放在web.config文件中,并给该模板命名,然后从属性中指向该模板。

一旦设置完成,您可以修改用于调试的web.config文件中的缓存持续时间,以便只有1秒。显然,您会让生产环境的web.config文件缓存持续时间更长。

有关模板的更多信息,请查看http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx


你不能对部分进行这样的操作。 - bobek

4
如果您想完全关闭它,可以使用以下方法:
<caching>
  <outputCache enableOutputCache="false" />
</caching>

在您的web.config文件中的system.web下。如果您想要通过代码(使用按钮或其他方式)来实现,您也可以这样做:
System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/");
System.Web.Configuration.OutputCacheSection cacheSection = (System.Web.Configuration.OutputCacheSection)config.GetSection("system.web/caching/outputCache");
cacheSection.EnableOutputCache = true/false;
config.Save();

这可能只适用于您的开发机器。大多数服务器都设置为不允许编辑 machine.config 中的该部分。


1
关闭它不应该是 enableOutputCache="false" 吗? - Maslow
非常感谢您提供的代码片段 - 这让我轻松地更改了性能测试的设置 :-D - Oliver

2
我只需要使用缓存依赖项。由于需要在运行时修改此更改,因此配置文件不是选项。
将以下内容添加到我想要“无缓存”选项的动作中。
Response.AddCacheItemDependency("Pages");

我创建了以下操作,可以调用以刷新缓存。
public ActionResult RefreshCache()
    {
        HttpContext.Cache.Insert("Pages", DateTime.Now, null,
                                 DateTime.MaxValue, TimeSpan.Zero,
                                 CacheItemPriority.NotRemovable,
                                 null);
        Logger.Info("Cleansed cache");
        return RedirectToAction("HubContent");
    }

2
这并不完全回答你的问题,但是回答了你的标题(即“如何清除缓存中的项目”):你可以添加一个“VaryByParam”:
[OutputCache(Duration=5000,VaryByParam="YourExistingParams;CacheBypass")]

当您想要绕过缓存时,只需传递CacheBypass参数的值为DateTime.UtcNow.Ticks(或任何随机值)=>例如:http://localhost/?CacheBypass=1234567890


VaryByParam还可以使用通配符(*),这样您就不必输入所有参数。这将缓存任何参数。但请谨慎使用[OutputCache(Duration=5000,VaryByParam="*")] - blockloop
当然可以,但这种行为可能并不是想要的(特别是如果他使用 GA 查询字符串跟踪)。注意:正如所述,这实际上并没有回答问题(但回答了标题),因为它并没有从缓存中删除该项目,只有他自己能看到更新的页面。 - Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接