如何在MVCSiteMapProvider的某些节点上禁用缓存?

问题描述:

我需要一个菜单​​结构根据用户当前正在查看的页面而改变。因此,我需要禁用某些节点的缓存,因为这些缓存可能会针对每个请求进行更改。我该怎么做呢?如何在MVCSiteMapProvider的某些节点上禁用缓存?

我曾尝试通过以下方式设立DynamicNode

var dynamicNode = new DynamicNode() 
{ 
    Title = title, 
    Action = actionName, 
    Controller = controllerName, 
    RouteValues = routeValues, 
    Attributes = attributes, 
    ChangeFrequency = ChangeFrequency.Always, 
    LastModifiedDate = DateTime.Now, 
    UpdatePriority = UpdatePriority.Automatic, 
}; 

但似乎有机会上没有影响。

我也在的Web.config文件中设置了cacheDuration="0",没有任何效果。

我也设置在GetCacheDesctription以下的DynamicNodeProvider

return new CacheDescription("GuideDynamicNodeProvider") 
{ 
    AbsoluteExpiration = DateTime.Now, 
}; 
没有效果

同样的。

我是否错误地使用这些设置?这方面的文件相当缺乏。

不支持禁用特定节点的缓存。但是,您可以通过将缓存持续时间设置为0来禁用整个站点地图的缓存。

如果您要做的是在数据更改时刷新节点,则可以使用SiteMapCacheReleaseAttribute或在数据更新时调用SiteMaps.ReleaseSiteMap()。另一方面,如果数据库中的数据不受您控制的来源更新,您可以自己实施ICacheDependency以创建SqlCacheDependency类,然后使用DI注入它。看看RuntimeFileCacheDependency class看看如何做到这一点。

请注意,ChangeMonitor放入列表的原因是,它将支持RuntimeCompositeCacheDependency,它允许您为同一缓存配置多个缓存依赖关系。

+0

我遇到类似的问题。我明确地调用'ReleaseSiteMap',但是当我从远程计算机访问时,它看起来像缓存仍然存在。我还能检查什么? – Shimmy 2015-07-21 16:22:23

+1

如果您在更新数据的每个(POST)操作方法上调用SiteMapCacheReleaseAttribute,则会更好。这可确保通话在适当的时间进行。请记住,更新数据的同一篇文章通常也会重新载入缓存,因此在拨打电话之前必须先更新数据。 – NightOwl888 2015-07-21 17:08:16

+0

我将'CacheDuration'设置为零。无论如何,我认为它必须对我的'VisibilityProvider'做。你认为它可能有问题吗?请看[代码](http://bit.ly/sitemapprovider),作为一个SiteMapProvider大师,我希望你在那里找到问题。 – Shimmy 2015-07-21 17:32:36