web-dev-qa-db-ja.com

ASP.NET Web APIでキャッシュを使用する方法は?

WEB APIでASP.NET MVC 4を使用しています

私は次のアクションを持っています、下に示すアクションでは、私のサービスメソッドはDoMagic()メソッドへのdb呼び出しを行い、整数値を返します。この値はすべてのページで使用され、このアクションはajax呼び出しを使用して呼び出されます。

以下は私のWEB APIアクションです:

_[OutputCache(Duration = 86400, VaryByParam = "none")]
[ActionName("GetMyMagicNumber")]
public int GetMyMagicNumber()
{
    if (WebSecurity.IsAuthenticated)
    {
        var revenue = _magicService.DoMagic();
        return revenue;
    }
    return 0;
}
_

私の質問:[OutputCache(Duration = 86400, VaryByParam = "none")]を使用してみましたが、db呼び出しが初めて行われ、このアクションへの次のリクエストでキャッシュされた値が返されることを除きましたが、これは発生しません。

Db呼び出しが再び行われますが、db呼び出しには時間がかかります。

45
Yasser

残念ながら、キャッシュはASP.NET Web APIに組み込まれていません。

これをチェックして、順調に進んでください: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

ここに更新されたリソース: https://github.com/filipw/AspNetWebApi-OutputCache

47
OakNinja

プロジェクトにSystem.Runtime.Cachingへの参照を追加します。ヘルパークラスを追加します。

using System;
using System.Runtime.Caching;


public static class MemoryCacher
{
    public static object GetValue(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Get(key);
    }

    public static bool Add(string key, object value, DateTimeOffset absExpiration)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        return memoryCache.Add(key, value, absExpiration);
    }

    public static  void Delete(string key)
    {
        MemoryCache memoryCache = MemoryCache.Default;
        if (memoryCache.Contains(key))
        {
            memoryCache.Remove(key);
        }
    }
}

次に、コードからキャッシュ内のオブジェクトを取得または設定します。

list = (List <ChapterEx>)MemoryCacher.GetValue("CacheItem1");

そして

MemoryCacher.Add("CacheItem1", list, DateTimeOffset.UtcNow.AddYears(1));
18
Sagi

OakNinjaで既に述べたように、[OutputCache]属性を介した出力キャッシュは、現在ASP.NET Web APIでサポートされていません。

ただし、ギャップを埋めるいくつかのオープンソース実装があります。

Strathweb.CacheOutput

MVCの「OutputCacheAttribute」に類似したキャッシュオプションをWeb APIアクションに提供する小さなライブラリ。

Github: https://github.com/filipw/Strathweb.CacheOutput
ライセンス:Apache v2

CacheCow

クライアント側とサーバー側の両方のASP.NET Web APIでのHTTPキャッシングの実装。

Github: https://github.com/aliostad/CacheCow
ライセンス:MIT

注:プロジェクトのREADMEによると、ライブラリは属性ルーティングをサポートしていません。

現在、CacheCowの属性設定は、属性ルーティングでは機能しません。そして、個人的には属性ルーティングを使用すべきではないと思います...(出典: https://github.com/aliostad/CacheCow/blob/master/README.md

Nice Scott Hanselmannによるブログ投稿 両方の機能セットをカバーしています。

15
CodeZombie

[ResponseCache]がASP.NET Coreでサポートされるようになりました

機能は[OutputCache]と同じように見えますが、[ResponseCache]はクライアント側専用です。

応答キャッシュは、キャッシュ関連のヘッダーを応答に追加します。これらのヘッダーは、クライアント、プロキシ、およびミドルウェアが応答をキャッシュする方法を指定します。

https://docs.Microsoft.com/en-us/aspnet/core/performance/caching/response

[ResponseCache(Duration = 3600)]
[HttpGet]
public IEnumerable<Product> Get()
{
  return _service.GetAll();
}
6
wonster