【问题标题】:Bypass OutputCache in ASP.NET MVC在 ASP.NET MVC 中绕过 OutputCache
【发布时间】:2011-01-11 20:45:03
【问题描述】:

我在我的 MVC 网站中使用 OutputCache 属性如下:

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

但有时我想完全绕过输出缓存并强制从数据库中提取。对于我不断将新数据加载到数据库中进行测试的测试环境来说尤其如此。

在这种情况下我是否可以绕过缓存?

谢谢。

【问题讨论】:

    标签: asp.net-mvc model-view-controller outputcache


    【解决方案1】:

    您可以使用 OutputCache 配置文件,而不是在属性中内联指定所有输出缓存参数。

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

    设置完成后,您可以更改用于调试的 web.config 中的设置,以便缓存持续时间仅为 1 秒。显然,您的生产 web.config 文件的持续时间会更长。

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

    【讨论】:

    • 你不能对部分内容这样做。
    【解决方案2】:

    如果你想完全关闭它,你可以使用

    <caching>
      <outputCache enableOutputCache="false" />
    </caching>
    

    在您的 web.config under.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 中编辑该部分。

    【讨论】:

    • 不会是enableOutputCache="false" 吗?
    • 非常感谢代码 sn-p - 这让我非常容易更改性能测试设置:-D
    【解决方案3】:

    我只需要使用缓存依赖项。我需要在运行时修改此更改,因此配置文件不是一个选项。

    在我想要启用“无缓存”选项的操作中添加了以下内容。

    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");
        }
    

    【讨论】:

      【解决方案4】:

      这并不能完全回答您的问题,但回答了您的标题(不是“如何从缓存中清除项目”): 您可以添加一个“VaryByParam”:

      [OutputCache(Duration=5000,VaryByParam="YourExistingParams;CacheBypass")]
      

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

      【讨论】:

      • VaryByParam 还采用通配符 (*),因此您不必输入所有参数。这将通过任何参数缓存。谨慎使用[OutputCache(Duration=5000,VaryByParam="*")]
      • 当然可以,但可能不需要这种行为(尤其是如果他使用 GA 查询字符串跟踪)。注意:如上所述,这实际上并没有回答问题(但回答了标题),因为它不会从缓存中删除该项目,他将是唯一看到更新页面的人。
      猜你喜欢
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多