web-dev-qa-db-fra.com

Comment utiliser la mise en cache dans l'API Web ASP.NET?

J'utilise ASP.NET MVC 4 avec Web API

J'ai l'action suivante. Dans l'action indiquée ci-dessous, ma méthode service appelle la méthode DoMagic() et en renvoie une valeur entière que j'utilise ensuite sur chaque page. Cette action est appelée à l'aide d'un appel ajax. .

Ci-dessous, mon action API Web:

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

Ma question: j'ai essayé d'utiliser [OutputCache(Duration = 86400, VaryByParam = "none")] et j'ai excepté que ce n'est que la première fois que l'appel de base de données sera effectué et que la demande suivante de cette action me renverra la valeur en cache, mais cela ne se produit pas.

Un appel de base de données est à nouveau effectué. L’appel de base de données prend un certain temps. Comment puis-je le faire fonctionner?

45
Yasser

Malheureusement, la mise en cache n'est pas intégrée à l'API Web ASP.NET.

Regardez ceci pour vous mettre sur la bonne voie: http://www.strathweb.com/2012/05/output-caching-in-asp-net-web-api/

Une ressource mise à jour ici: https://github.com/filipw/AspNetWebApi-OutputCache

47
OakNinja

Ajoutez une référence à System.Runtime.Caching dans votre projet. Ajouter une classe d'assistance:

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

Ensuite, à partir de votre code, récupérez ou définissez des objets dans le cache:

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

et

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

Comme déjà mentionné par OakNinja, la mise en cache de sortie via [OutputCache] attributs n’est actuellement pas pris en charge par l’API Web ASP.NET.

Cependant, quelques implémentations open source comblent les lacunes:

Strathweb.CacheOutput

Une petite bibliothèque offrant des options de mise en cache, similaire au "OutputCacheAttribute" de MVC, aux actions de l'API Web.

Github: https://github.com/filipw/Strathweb.CacheOutput
Licence: Apache v2

CacheCow

Une implémentation de la mise en cache HTTP dans l'API Web ASP.NET pour le côté client et le côté serveur.

Github: https://github.com/aliostad/CacheCow
Licence: MIT

Remarque: selon le fichier README du projet, la bibliothèque ne prend pas en charge le routage d'attribut :

Actuellement, le paramètre d'attribut de CacheCow ne fonctionne pas avec le routage d'attribut. Et personnellement, je pense que vous ne devriez pas utiliser le routage d'attributs ... (Source: https://github.com/aliostad/CacheCow/blob/master/README.md )

Il existe un Nice article de blog de Scott Hanselmann couvrant les deux ensembles de fonctionnalités.

15
CodeZombie

[ResponseCache] est maintenant supporté dans ASP.NET Core

Les fonctionnalités peuvent sembler identiques à [OutputCache] mais [ResponseCache] est uniquement pour le côté client.

La mise en cache des réponses ajoute des en-têtes liés au cache aux réponses. Ces en-têtes spécifient comment vous voulez que le client, le proxy et le middleware mettent en cache les réponses.

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

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