J’adore l’AppFabric, mais par moment, il faut savoir s’en passer. Dans ces cas là, il faut sortir des oubliettes de bons vieux codes qui ont fait leurs preuves.

Aujourd’hui je vous propose d’exhumer le System.Web.Caching.Cache. Trop souvent négligé (car rarement présenté en formation, c’est dommage), l’ami System.Web.Caching.Cache n’a pas les possibilités de cache partagées entre plusieurs serveurs de l’AppFabric, mais il peut vous permettre de garder dans un cache serveur des données récurées à un instant T. Son principe d’utilisation est similaire : on a une collection qui permet, d’obtenir, d’ajouter ou de supprimer des données.

Dans le petit exemple que je propose ici, j’ai codé rapidement un Handler qui permet de retourner des images provenant d’une base de données (scénario classique et souvent d’actualité). Les arguments étant l’élément discriminent de la requête, j’utilise le QueryString de celle-ci comme clé pour la mise en cache.

 

public class Handler1 : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        String arg1 = context.Request["arg1"];
        String arg2 = context.Request["arg2"];

        Byte[] data;

        // Récupération de l'objet cache
        Cache cache = context.Cache;

        // Création de la clé utiliser par le cache
        String cacheKey = context.Request.QueryString.ToString();

        // Récupération des données du cache
        Object cachedData = cache.Get(cacheKey);

        if (cachedData == null)
        {
            // 
            // TODO : Ajouter ici la logique pour aller chercher la donnée 
            // data = ...
            //

            try
            {
                cache.Add(cacheKey,
                            data,
                            null,
                            System.Web.Caching.Cache.NoAbsoluteExpiration,
                            System.Web.Caching.Cache.NoSlidingExpiration,
                            CacheItemPriority.Normal,
                            null);
            }
            catch(Exception ex)
            {
                // TODO : faire ce que vous voulez des informations de l'execption
            }

        }
        else
        {
            // Convertir les donnée stockées dans le cache serveur
            data = (Byte[])cachedData;
        }

        // Ecriture de l'image en sortie
        var response = context.Response;
        response.Clear();
        response.ContentType = "image/jpeg";
        response.BinaryWrite(data);
        response.Flush();

        // Gestion du cache http serveur/proxy/client
        response.Cache.SetCacheability(HttpCacheability.Public);
        response.Cache.SetExpires(DateTime.Now.AddDays(7));
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Note : rien à voir  avec System.Web.Caching.Cache, mais dans le cas d’un handler, on peut aussi profiter d’un cache http serveur/proxy/client (dernières lignes de la réponse)