2015-10-28 19 views
7

kann mir jemand erklären, wie man Caching von JsonResult Aktionen in MVC 5 Anwendung implementieren? Ich möchte Caching von einigen ajax-aufgerufenen Aktionen mit Attribut verwenden. Einige dieser Aktionen geben ActionResult mit html -content, einige JsonResult mit serialisierten Listen von {Id, Title}-Paaren zurück, die ich verwenden werde, um Dropdown-Listen zu erstellen.ASP.Net MVC 5 JsonResult Caching

Mein Ziel ist es, die Anzahl der DB-Abfragen (beim Erstellen von ViewModels) und Serveranforderungen (bei Verwendung von Ajax-Aufrufe dafür) zu reduzieren.

So sieht mein Code wie Schnipsel unten:

[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); 
} 

Wenn ich FireFox Tools-Panel sehe ich das nächste Bild zu sehen für Html -Gehalts: FF caching html content

hier Firefox verwendet clientseitige gecached Version von ajax angeforderte Seite.

Aber Situation unterscheidet sich json -Gehalts: FF doesn't cache json content

Es spielt keine Inhalte zwischenzuspeichern, und scheint Daten vom Server (Server-Side-Cache) zu übertragen.

In beiden Fällen Response-Header gleich aussehen:

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

Inhalt angefordert wird ähnlich ajax -calls wie

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

Also, wie Cache-I json-Inhalte? Was ist der richtige Weg, und warum Standardansatz nicht funktioniert?

+0

Betreffen andere Browser die Cache-Header? Scheint FF ignoriert dies für AJAX-Anfragen. Sie können auch den ObjectCache ('HttpContext.Current.Cache') verwenden, um das Ergebnis einer Abfrage zu speichern. – Jasen

+0

@Jasen, eigentlich wenn ich Link direkt im Browser öffne (ohne 'Ajax') Ergebnis ist das gleiche trotzdem. In Chrome Situation sieht auch ähnlich – teran

+0

Haben Sie das versucht? http://stackoverflow.com/questions/8535160/outputcache-attribute-and-jquery-ajax-not-caching –

Antwort

1

Wenn Sie DB-Abfragen vermeiden möchten, sollten Sie die Daten serverseitig zwischenspeichern. Sie können dazu die Klasse MemoryCache verwenden.

Schnell Probe

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; 
     } 
    } 
} 

Sie können die Methode Signatur ändern Sie den gewünschten Typ zurückzukehren. Zur Vereinfachung verwende ich List<String>