5 votes

Comment puis-je utiliser [OutputCache (Duration=2000)] avec une valeur de durée variable et réinitialiser le cache du serveur ?

J'ai le code ci-dessous et je veux Duration sur [OutputCache(Duration = 10)] pour avoir une valeur variable afin que je puisse la lire à partir de DB ou d'un List Collection.

Et Je veux pouvoir réinitialiser le cache du serveur immédiatement, quand Duration avait changé.

Comment puis-je faire Duration variée et réinitialisée en cache HTML données lorsque le Duration est modifié ? Voici mon code.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Cache_Example.Controllers
{
    public class HomeController : Controller
    {

        // GET: Home
       // [OutputCache(Duration = 10)]
        public ActionResult Index()
        {
            return View();
        }

        [OutputCache(Duration = 10)]
        public ActionResult ShowDate()
        {
            return PartialView();
        }
    }
}

7voto

Jeremy Thompson Points 14428

Pour modifier la durée, procédez comme suit :

Comment utiliser une valeur de durée dynamique dans la mise en cache de sortie ? (veuillez créditer l'auteur original)

J'hériterais de la OutputCache et y définir l'attribut Duration :

public static class CacheConfig
{
    public static int Duration = 36600;
}

public class MyOutputCacheAttribute : OutputCacheAttribute
{
    public MyOutputCacheAttribute()
    {
        this.Duration = CacheConfig.Duration;
    }
}

[MyOutputCache(VaryByParam = "none")]
public ActionResult Index()
{
    return View();
}

Ensuite, vous pouvez modifier le Duration de manière dynamique et globale par le biais du CacheConfig.Duration

Et vous pouvez toujours remplacer le paramètre global sur chaque action si vous le souhaitez :

[MyOutputCache(Duration = 100, VaryByParam = "none")]
public ActionResult OtherAction()
{
    return View();
}

Vous pouvez alors réinitialiser le cache du serveur immédiatement lorsque Durée a changé vous-même. Voici comment procéder :

"L'objet de cache ASP.NET est situé dans l'espace de noms System.Web et, comme il s'agit d'une implémentation de cache générique, il peut être utilisé dans toute application qui fait référence à cet espace de noms.

La classe System.Web.Caching.Cache est un cache d'objets. On y accède soit par la propriété statique System.Web.HttpRuntime.Cache, soit par les propriétés d'instance d'aide System.Web.UI.Page et System.Web.HttpContext.Cache. Il est donc disponible en dehors du contexte d'une requête. Il n'y a qu'une seule instance de cet objet dans tout un domaine d'application, de sorte que l'objet HttpRuntime.Cache peut exister dans chaque domaine d'application en dehors d'Aspnet_wp.exe.

Le code suivant montre comment accéder à l'objet cache ASP.NET à partir d'une application générique.

HttpRuntime httpRT = new HttpRuntime();
Cache cache = HttpRuntime.Cache;

Après avoir accédé à l'objet cache pour la requête en cours, vous pouvez utiliser ses membres de la manière habituelle."

REF : Source MSDN obsolète : Guide de l'architecture de mise en cache pour les applications .NET Framework

Note : Avec .Net 3.5, vous ne pouviez utiliser que le cache InProc, avec .NET 4, vous pouvez stocker votre cache en dehors du processus ainsi qu'utiliser des fichiers personnalisés CacheProviders .

Je veux insister sur ce point, si le cache est censé durer plus longtemps que le recyclage de l'AppPool (par exemple quotidiennement), alors vous devez mettre en cache Out-Of-Process.


Vérifiez également qu'il est mis en cache sur le serveur : http://msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X