2015-10-28 4 views
7

может кто-нибудь объяснить мне, как реализовать кэширование JsonResult действий в приложении MVC 5? Я хочу использовать кеширование некоторых ajax -описанных действий с использованием атрибута [OutputCache()]. Некоторые из этих действий возвращают ActionResult с html -content, некоторые JsonResult с сериализованными списками из {Id, Title} пар, которые я собираюсь использовать для выпадающих списков.ASP .Net MVC 5 Кэширование JsonResult

Моя цель - уменьшить количество запросов БД (при построении ViewModels) и запросов сервера (при использовании ajax-вызовов для него).

Итак, мой код выглядит фрагменты ниже:

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

Когда я смотрю на FireFox инструментов панели я вижу следующую картины для Html -поперечника: FF caching html content

Здесь Firefox использует на сторону клиента, сохраненный версия ajax - запрашиваемая страница.

Но ситуация отличается json -поперечник: FF doesn't cache json content

Он не кэширует содержимое, и, кажется, для передачи данных от сервера (на стороне сервера кэша).

В обоих заголовках случаев ответа выглядят одинаково:

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

Содержимое запрашивается с использованием аналогичных ajax -calls как

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

Итак, как я кэшировать JSON-контент? как правильно это сделать, и почему подход по умолчанию не работает?

+0

Другие браузеры относятся к заголовкам кеша? Кажется, FF игнорирует это для запросов AJAX. Вы также можете использовать ObjectCache ('HttpContext.Current.Cache') для хранения результата из запроса. – Jasen

+0

@Jasen, на самом деле, когда я открываю ссылку непосредственно в браузере (без 'ajax'), результат все равно будет. В Chrome ситуация также выглядит аналогично – teran

+0

Вы попробовали? http://stackoverflow.com/questions/8535160/outputcache-attribute-and-jquery-ajax-not-caching –

ответ

1

Если вы хотите избежать запросов БД, вам следует рассмотреть вопрос о кешировании данных на стороне сервера. Для этого вы можете использовать класс MemoryCache.

Быстрый образец

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

Вы можете изменить сигнатуру метода для возвращения типа вы хотите. Для простоты я использую List<String>

Смежные вопросы