2015-10-28 27 views
7

qualcuno può spiegarmi come implementare la memorizzazione nella cache delle azioni JsonResult nell'applicazione MVC 5? Voglio utilizzare la memorizzazione nella cache di alcune azioni ajax -called utilizzando l'attributo [OutputCache()]. Alcune di queste azioni restituiscono ActionResult con html -content, alcune JsonResult con elenchi serializzati di coppie {Id, Title} che userò per creare elenchi a discesa.ASP .Net MVC 5 Cache JsonResult

Il mio obiettivo è ridurre la quantità di query DB (durante la creazione di ViewModels) e le richieste del server (quando si utilizza una chiamata -jax per esso).

Quindi, il mio codice è simile frammenti di seguito:

[OutputCache(Duration=60*60*24)] 
public async Task<ActionResult> SearchCaseOrgDialog(){ 
    //extract data return html page 
    return View(); 
} 

[OutputCache(Duration=60*60*24)] 
public async Task<JsonResult> AjaxOrgDepartments(){ 
    //query database, serialize data, return json 
    var result = await ctx.OrgDepartments 
          .Select(d => new { 
             Id = d.Id, 
             Title = d.Title } 
           ) 
          .ToListAsync(); 

    return Json(result, JsonRequestBehavior.AllowGet); 
} 

Quando guardo FireFox strumenti del pannello vedo immagine successiva per Html -CONTENUTO: FF caching html content

Qui Firefox utilizza cache sul lato client versione di ajax - pagina richiesta.

Ma la situazione è diversa con json -CONTENUTO: FF doesn't cache json content

Essa non memorizza nella cache il contenuto, e sembra per trasferire i dati dal server (cache lato server).

In entrambi i casi, le intestazioni di risposta lo stesso aspetto: è richiesto

Cache-Control:"public, max-age=86400, s-maxage=0" 

contenuti utilizzando simili ajax -calls come

$.get(url, null, function(data){ 
    //do something with data 
}); 

Allora, come faccio a Cache JSON-contenuti? qual è il modo giusto per farlo e perché l'approccio predefinito non funziona?

+0

Gli altri browser rispettano le intestazioni della cache? Sembra che FF ignori questo per richieste AJAX. È anche possibile utilizzare ObjectCache ('HttpContext.Current.Cache') per memorizzare il risultato da una query. – Jasen

+0

@Jasen, in realtà quando apro il collegamento direttamente nel browser (senza 'ajax') il risultato è lo stesso comunque. Anche in Chrome la situazione sembra simile – teran

+0

Hai provato questo? http://stackoverflow.com/questions/8535160/outputcache-attribute-and-jquery-ajax-not-caching –

risposta

1

Se si desidera evitare le query DB, è consigliabile prendere in considerazione la memorizzazione nella cache dei dati sul lato server. Puoi usare la classe MemoryCache per farlo.

campione rapida

public class MyLookupDataCache 
{ 
    const string categoryCacheKey = "CATEGORYLIST"; 
    public List<string> GetCategories() 
    { 
     var cache = MemoryCache.Default; 
     var items = cache.Get(categoryCacheKey); 
     if (items != null) 
     { 
      CacheItemPolicy policy = new CacheItemPolicy(); 
      policy.AbsoluteExpiration = DateTime.Now.AddDays(7); //7 days 
      //Now query from db 
      List<string> newItems = repository.GetCategories(); 
      cache.Set(categoryCacheKey, newItems, policy); 
      return newItems; 
     } 
     else 
     { 
      return (List<string>) items; 
     } 
    } 
} 

È possibile modificare la firma del metodo per restituire il tipo che si desidera. Per semplicità, sto usando List<String>

Problemi correlati