2015-10-28 23 views
7

誰かがMVC 5アプリケーションでJsonResultアクションのキャッシングを実装する方法を教えてもらえますか? ajaxの呼び出しを、[OutputCache()]属性を使用して呼び出したいとします。これらのアクションの一部は、とhtmlという内容のコンテンツを返します。{Id, Title}という一連のリストを持つJsonResultのペアは、ドロップダウンリストの作成に使用します。ASP .Net MVC 5 JsonResultキャッシング

私の目標は、(ViewModelsの構築中に)DB問合せの量を減らし、サーバー要求(ajax呼び出しを使用する場合)の量を減らすことです。 FF caching html content

ここでFirefoxは、クライアント側のキャッシュされたを使用しています:Html - 含有量のために、私はFireFoxのツールパネルを見てみると

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

私が見る次の画像:

だから、私のコードは次のスニペットのようになります。 ajax - 要求されたページのバージョン。

しかし、状況はjson - 含有量とは異なります FF doesn't cache json content

それは、コンテンツをキャッシュし、サーバ(サーバ側のキャッシュ)からデータを転送するようではありません。どちらの場合も、レスポンスヘッダで

は同じように見える:

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

コンテンツが要求され

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

のように似たajax -callsを使用して、私はJSON-コンテンツをキャッシュしますか?それを行う正しい方法は何ですか?また、デフォルトのアプローチが機能しない理由は何ですか?

+0

他のブラウザはキャッシュヘッダーを尊重していますか? FFがAJAX要求に対してこれを無視しているようです。また、ObjectCache( 'HttpContext.Current.Cache')を使用してクエリの結果を格納することもできます。 – Jasen

+0

@ジャセン、実際にブラウザで直接リンクを開くと(「ajax」なしで)結果は同じです。 Chromeの状況でも同様に見える – teran

+0

これを試しましたか? http://stackoverflow.com/questions/8535160/outputcache-attribute-and-jquery-ajax-not-caching –

答えて

1

DBクエリを避けたい場合は、サーバー側でデータをキャッシュすることを検討する必要があります。これを行うには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>