web-dev-qa-db-fra.com

Mise en cache dans asp.net-mvc

Je voudrais mettre en cache les actions les plus lourdes de ma base de données sur mon site asp.net-mvc . Dans mes recherches, j'ai trouvé 

Mais je ne pense pas l'avoir encore.
Je veux pouvoir mettre en cache ma demande POST en fonction de plusieurs pars. Ces pars sont dans un objet. Je voudrais donc mettre en cache le résultat de la requête suivante:

public ActionResult AdvancedSearch(SearchBag searchBag)

Où searchBag est un objet qui contient (un groupe) de paramètres de recherche facultatifs . Mes vues elles-mêmes sont légères (comme il se doit), mais l'accès aux données peut prendre beaucoup de temps, selon les champs renseignés sac de recherche.

J'ai le sentiment que je devrais mettre en cache sur mon datalayer, plutôt que sur mes actions.
Comment suis-je censé utiliser VaryByParam dans l'attribut OutputCache?

81
Boris Callens

J'aime bien mettre en cache dans le modèle ou la couche de données. Cela isole tout ce qui concerne la récupération des données du contrôleur/de la présentation. Vous pouvez accéder au cache ASP.NET à partir de System.Web.HttpContext.Current.Cache ou utiliser le bloc d'application de mise en cache à partir de la bibliothèque d'entreprise. Créez votre clé pour les données mises en cache à partir des paramètres de la requête. Assurez-vous d'invalider le cache lorsque vous mettez à jour les données.

73
Matthew

Ou vous pouvez être indépendant de HttpContext.Current et accéder au cache à partir de HttpRuntime.Cache :)

65
Andrei Rînea

OutputCaching peut souvent être le plus rapide et le plus efficace, mais uniquement lorsqu'il répond à vos besoins. Inutile d'avoir rapide efficace si c'est faux! ;)

Dans ce cas, il semble que la mise en cache au niveau de la couche de données soit correcte car vos besoins en mise en cache sont complexes. Parfois, vous pouvez combiner les deux si l'ensemble des paramètres qui contrôlent la sortie mise en cache est simple. 

11
Haacked

vous pouvez utiliser la mise en cache de sortie quelque chose comme ceci

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

ou vous pouvez utiliser les profils de cache définis dans web config

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
0
Nikki