2013-04-29 58 views
2

我需要一個菜單​​結構根據用戶當前正在查看的頁面而改變。因此,我需要禁用某些節點的緩存,因爲這些緩存可能會針對每個請求進行更改。我該怎麼做呢?如何在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, 
}; 
沒有效果

同樣的。

我是否錯誤地使用這些設置?這方面的文件相當缺乏。

回答

1

不支持禁用特定節點的緩存。但是,您可以通過將緩存持續時間設置爲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