【问题标题】:Disable MvcSiteMapProvider caching禁用 MvcSiteMapProvider 缓存
【发布时间】:2011-06-14 17:31:16
【问题描述】:

MvcSiteMapProvider 似乎发生了自动缓存。是否有禁用缓存的机制?我们编写了自定义缓存例程,我想通过这些例程运行它,而不是依赖任何内置的缓存机制。

【问题讨论】:

    标签: c# asp.net-mvc caching model-view-controller mvcsitemapprovider


    【解决方案1】:

    尝试在渲染菜单或站点地图之前调用 Refresh。

    <% var sm = Html.MvcSiteMap();
    ((MvcSiteMapProvider.DefaultSiteMapProvider)sm.Provider).Refresh(); %>
    ....
    <%: sm.Menu(0, 1) %>
    

    【讨论】:

    • 我也可以从控制器拨打Refresh吗?
    • 当前版本好像没有这个
    【解决方案2】:

    在 MvcSiteMapProvider v4 中,缓存现在可以扩展或替换为您自己的实现。看看我写的以下博客文章。

    MvcSiteMapProvider 4.0 - Extending the Cache

    它现在使用 System.Runtime.Caching.ObjectCache,这是一个抽象类,可以由您选择的缓存管理器替换。

    【讨论】:

    • 网站似乎已关闭。无论如何,我们如何关闭缓存?
    【解决方案3】:

    查看源代码,在构建站点地图时始终会创建一个缓存项,将该项存储在HttpContext.Current.Cache 中。此缓存项的生命周期由配置cacheDuration 中的属性配置。如果配置中省略该属性,则默认为 5。尝试将该配置属性设置为 0。

    <siteMap defaultProvider="MvcSiteMapProvider" enabled="true"> 
      <providers> 
        <clear /> 
        <add name="MvcSiteMapProvider" 
             type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" 
             cacheDuration="5" /> 
      </providers> 
    </siteMap>
    

    【讨论】:

    • 不幸的是,这不起作用。可能只是等待 3.0 最终版本并自己修改源以删除缓存。不过,我更喜欢禁用缓存的选项,以便在将新版本发布到 CodePlex 时继续轻松更新 MvCSiteMapProvider ...
    【解决方案4】:

    有点老套,但谁在乎:

            foreach (var c in from object c in HttpContext.Cache where ((System.Collections.DictionaryEntry)c).Key.ToString().Contains("__MVCSITEMAP") select c)
            {
                HttpContext.Cache.Remove(((System.Collections.DictionaryEntry)c).Key.ToString());
    
                break;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 2011-03-11
      • 2014-08-12
      • 2011-11-03
      • 2013-11-15
      • 2019-07-08
      • 2012-01-12
      • 2012-07-29
      相关资源
      最近更新 更多