Disabilita MvcSiteMapProvider caching
-
24-10-2019 - |
Domanda
Sembra che ci sia il caching automatico che accade con MvcSiteMapProvider. Esiste un meccanismo di caching disabilitare? Abbiamo personalizzato caching routine scritte e voglio correre attraverso quelle, invece di fare affidamento su qualsiasi costruito nel meccanismo di caching.
Soluzione
Prova a chiamare Refresh prima di menu o mappa del sito di rendering.
<% var sm = Html.MvcSiteMap();
((MvcSiteMapProvider.DefaultSiteMapProvider)sm.Provider).Refresh(); %>
....
<%: sm.Menu(0, 1) %>
Altri suggerimenti
In MvcSiteMapProvider v4, la cache può ora essere esteso o sostituita con una propria implementazione. Date un'occhiata al seguente post sul blog che ho scritto.
MvcSiteMapProvider 4.0 - Estendere la cache
Sotto le coperte che ora utilizza System.Runtime.Caching.ObjectCache, una classe astratta che può essere sostituito da un manager di cache di tua scelta.
Guardando oltre la fonte, una voce di cache viene sempre creato quando la mappa del sito è costruito, memorizzare l'oggetto in HttpContext.Current.Cache
. La durata di questa voce di cache è configurato da una proprietà nella cacheDuration
configurazione. Se questo attributo viene omesso dalla configurazione, il valore predefinito è 5. provare a impostare l'attributo di configurazione a 0.
<siteMap defaultProvider="MvcSiteMapProvider" enabled="true">
<providers>
<clear />
<add name="MvcSiteMapProvider"
type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider"
cacheDuration="5" />
</providers>
</siteMap>
Un po 'hacky ma che importa:
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;
}