2011-01-25 7 views
7

Ho una semplice visione parziale che sto rendendo a mio avviso principale con:ASP.NET MVC 3 Page parziale uscita di caching non onorare impostazioni di configurazione

@Html.Action("All", "Template") 

Il mio controller ho questo:

[OutputCache(CacheProfile = "Templates")] 
    public ActionResult All() 
    { 
     return Content("This stinks."); 
    } 

E nel mio config questo:

<caching> 
    <outputCacheSettings> 
    <outputCacheProfiles> 
     <clear/> 
     <add name="Templates" duration="3600" varyByParam="none"/>  
    </outputCacheProfiles> 
    </outputCacheSettings> 
    <outputCache enableOutputCache="false" enableFragmentCache="false" /> 
</caching> 

questo non riuscirà a runtime con l'eccezione:

Errore durante l'esecuzione richiesta figlio per handler 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper

E eccezione interna:

durata deve essere un numero positivo

Ora ovviamente non sta rilevando le mie impostazioni web.config, perché se lo cambio in:

[OutputCache(Duration = 3600)] 

Si lavorerà, a meno di notare anche nel mio web.config ho spento enableOutputCache e enableFragmentCache, ma non rispetta queste impostazioni.

Stranamente, in una vista normale queste impostazioni funzionano bene, quindi che cos'è per le viste parziali che sta rompendo questo? Mi sto perdendo qualcosa? The Gu says this should work just fine... In breve, è possibile rispettare le impostazioni di memorizzazione nella cache in web.config e, in caso contrario, perché no?

+0

Duplicato: http://stackoverflow.com/questions/4728958/chaching-childactions-using-cache-profiles-wont-work – frennky

+0

Sono simili, ma parlo del mio problema più grande che è che non funziona Rispettare le impostazioni come il fatto che la cache di output è disabilitata. –

risposta

5

Così ho preso un minuto e guardato la fonte MVC 3. La prima cosa che mi è venuta in mente è che questa funzionalità sembrava un po 'hacky. Principalmente perché stanno riutilizzando un attributo che funziona in una situazione rispettando tutte le proprietà e le impostazioni di configurazione e quindi nello scenario azione figlio ignorando tutte quelle impostazioni e consentendo solo VaryByParam e Durata.

Come si potrebbe capire che cosa è supportato è oltre me. Perché l'eccezione che vogliono gettare che dice non supportato Impostazione potrà mai ottenere gettato a meno che non avete fornito una durata e un VaryByParam valore

Ecco il pezzo principale di codice che odora:

if (Duration <= 0) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidDuration); 
} 

if (String.IsNullOrWhiteSpace(VaryByParam)) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidVaryByParam); 
} 

if (!String.IsNullOrWhiteSpace(CacheProfile) || 
    !String.IsNullOrWhiteSpace(SqlDependency) || 
    !String.IsNullOrWhiteSpace(VaryByContentEncoding) || 
    !String.IsNullOrWhiteSpace(VaryByHeader) || 
    _locationWasSet || _noStoreWasSet) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_ChildAction_UnsupportedSetting); 
} 

I Non sono sicuro del motivo per cui questo non viene chiamato in documentation, ma anche se fosse l'API dovrebbe essere chiaro, o almeno lanciare l'eccezione giusta.

In breve, il caching dell'output parziale funziona, BUTT non è come lo vorrebbe anche tu. Lavorerò per correggere il codice e per onorare alcune impostazioni come abilitate.

Aggiornamento: ho fissato l'implemenation corrente ad almeno il lavoro per la mia situazione con il rispetto della bandiera abilitato e consentendo profili di cache dal web.config. Detailed in my blog post.

+0

questo è un sacco di lavoro! grazie, potrebbe essere un po 'eccessivo per quello che mi serve. cercando qualcosa di base –

0

Ecco un approccio più semplice se:

  • Il tuo obiettivo fondamentale è quello di essere in grado di disabilitare la cache durante il debug, e attivarlo durante la distribuzione
  • Non sono presenti criteri di caching complicate
  • Non si dispone di un complicato sistema di distribuzione basato sulla sintassi di caching di Web.config
  • Ideale se si utilizza XDT web transformations già

Tutto ciò che ho fatto è stato creato un nuovo attributo 'DonutCache'.

[DonutCache] 
public ActionResult HomePageBody(string viewName) 
{ 
    var model = new FG2HomeModel(); 

    return View(viewName, model); 
} 

Purtroppo è possibile inizializzare solo [Attribute] con una costante, quindi è necessario inizializzare l'attributo nel suo costruttore. Nota: ciò non impedisce di impostare 'varyByParam' nella dichiarazione [DonutCache].

class DonutCacheAttribute : OutputCacheAttribute 
{ 
    public DonutCacheAttribute() 
    { 
     Duration = Config.DonutCachingDuration; 
    } 
} 

Qui sto solo inizializzare l'attributo dal mio web.config per mezzo di una proprietà statica:

<appSettings> 
    <add key="DonutCachingDuration" value="5"/> 
</appSettings> 


public static class Config { 
    public static int DonutCachingDuration 
    { 
     get 
     { 
      return int.Parse(ConfigurationManager.AppSettings["DonutCachingDuration"]); 
     } 
    } 
} 

Poi, naturalmente, è possibile utilizzare il XDT web di trasformazione si sta già utilizzando per modificare questo valore

Problemi correlati