如何在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
,它允许您为同一缓存配置多个缓存依赖关系。
我遇到类似的问题。我明确地调用'ReleaseSiteMap',但是当我从远程计算机访问时,它看起来像缓存仍然存在。我还能检查什么? – Shimmy 2015-07-21 16:22:23
如果您在更新数据的每个(POST)操作方法上调用SiteMapCacheReleaseAttribute,则会更好。这可确保通话在适当的时间进行。请记住,更新数据的同一篇文章通常也会重新载入缓存,因此在拨打电话之前必须先更新数据。 – NightOwl888 2015-07-21 17:08:16
我将'CacheDuration'设置为零。无论如何,我认为它必须对我的'VisibilityProvider'做。你认为它可能有问题吗?请看[代码](http://bit.ly/sitemapprovider),作为一个SiteMapProvider大师,我希望你在那里找到问题。 – Shimmy 2015-07-21 17:32:36