2009-09-17 15 views
5

sto cercando di utilizzare OutputCaching nel mio sito Web ASP.NET MVC. Il problema è che quando provo a cambiare il valore di uno dei miei parametri querystring, restituisco i dati per il primo oggetto richiesto!Il caching non funziona correttamente nel mio sito Web ASP.NET MVC?

Ecco il mio codice (con i nomi cambiati param) ...

[ApiAuthorize] 
[HandleErrorAsJson] 
public class SearchController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    [OutputCache(Duration = 60, VaryByParam = "*")] 
    public ActionResult ScoreCard(string foo, byte? bar, byte? pewpew) 
    { 
    .. 
    } 
} 
  • NOTA 1: ApiAuthorize - attributo personalizzato che verifica la presenza di un parametro querystring chiamato 'chiave' e controlla un dizionario di memoria, per vedere se esiste
  • NOTA 2: HandleErrorAsJson - attributo personalizzato che restituisce il messaggio di errore come json se è stata/è stata generata un'eccezione.

ed ecco due chiamate di esempio che sto facendo a questa azione: -

in modo che i dati della prima chiamata (foo = ciao mondo, Pew Pew) viene restituito come 200 OK. Quindi la seconda chiamata api restituisce 200 OK ma con i dati della chiamata precedente.

Inoltre, non sto utilizzando alcun server proxy. Se commento l'attributo OutputCache, tutto va bene.

Ho anche provato il seguente (messa manualmente ogni volta ho bisogno di cache) .....

[OutputCache(Duration = 60, VaryByParam = "foo,key,bar,pewpew")] 

Nessuna fortuna :(

Notate come ho bisogno di fare in modo che i includi il parametro "Chiave" dell'API come parte della chiave univoca della cache. Non voglio che le persone cerchino la stessa cosa, ma se la seconda persona non ha la chiave giusta, non dovrebbero ottenere un risultato memorizzato nella cache , ma un messaggio di errore (tecnicamente, è un 401 non autorizzato, ma comunque) ...

Tu combatte?

risposta

4

L'elenco dei parametri in VaryByParam deve essere delimitato da punto e virgola, non delimitato da virgole. Provaci. Detto questo, il * dovrebbe aver funzionato.

+0

+1 più direttamente focalizzato sulla domanda a portata di mano. anche se non penso che sia l'unico problema che ha qui. ha risposto anche al tuo commento qui sotto. – dove

0

Uso un filtro per la cache di output che fornirà il controllo programmatico per il debug e che verrà impostato anche quando necessario. Sentitevi liberi di usare questo e vedere se l'impostazione qui avrebbe fatto la differenza, che penso che potrebbe (anche assicurarsi qualsiasi caching precedente viene cancellato)

public class CacheFilterAttribute : ActionFilterAttribute 
    { 
     private const int Second = 1; 
     private const int Minute = 60 * Second; 
     private const int Hour = 60 * Minute; 
     public const int SecondsInDay = Hour * 24; 


     /// <summary> 
     /// Gets or sets the cache duration in seconds. The default is 10 seconds. 
     /// </summary> 
     /// <value>The cache duration in seconds.</value> 
     public int Duration 
     { 
      get; 
      set; 
     } 

     public int DurationInDays 
     { 
      get { return Duration/SecondsInDay; } 
      set { Duration = value * SecondsInDay; } 
     } 

     public CacheFilterAttribute() 
     { 
      Duration = 10; 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      if (Duration <= 0) return; 

      HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
      TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration); 

      cache.SetCacheability(HttpCacheability.Public); 
      cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
      cache.SetMaxAge(cacheDuration); 
      cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
     } 
    } 

sto solo usando questo finora per una parte molto statica di un sito, in modo da avere una chiamata del genere

[CacheFilter(DurationInDays = 1)] 

Ovviamente vorrei solo di estendere questo per avere VaryByParams esposto come una proprietà, in grado di fornire, ma suona come sapresti cosa fare.

+0

Per interessi, perché hai finito per creare il tuo Attributo, qui? –

+0

Ho applicato un paio di visualizzazioni e farò di più. Non ero al 100% sulle impostazioni esatte che vedi sopra e quindi con questo ho facilmente potuto modificare e sapere che è stato applicato ovunque.Non sono ancora fissato se aggiungere più intestazioni quando si imposta la cache. Ovviamente se trovo che questa sia una cattiva idea, posso rendere questa un'estensione pulita dell'attributo OutputCache e non perdere nulla. Quindi, in breve, aveva qualcosa da guadagnare con un chiaro percorso verso la sicurezza se si presentava qualche rischio. – dove

+0

Non c'è niente di sbagliato in ciò che ha fatto qui, ma non risponde alla tua domanda. Il filtro che ha creato influenza la cache * del browser *, non la memorizzazione nella cache del server. È legittimo da fare, e non sono a conoscenza di qualcosa di integrato in ASP.NET MVC che lo fa. Inoltre, implicitamente, fa un buon punto, cioè che ci sono due cache diverse in gioco qui, quella nel browser e quella nel server. La tua domanda mi sembra essere correlata alla cache del server, anche se sarebbe bene ricontrollarlo con Firebug o Fiddler. –

Problemi correlati