févr. 21 2011

[ASP.NET MVC] Nouveautés MVC 3 Part 8 - Amélioration du cache de sortie

Category: ASP.NET | ASP.NET MVC | ASP.NET MVC 3Nicolas Esprit @ 14:39

Le cache de sortie est une fonctionnalité de la plateforme ASP.NET qui existe depuis la version 1.0. Le principe est simple, à savoir qu'une page ASP.NET va mettre en cache tout ou partie du code HTML généré par une page Web, ce qui permettra d'accélérer les accès ultérieurs à la page, en diminuant le temps de rendu.

Ce billet fait suite à la série sur les nouveautés d'ASP.NET MVC 3 écrit conjointement avec Philippe Viallate. Vous pouvez consulter les précédents billets :

Cette fonctionnalité était bien entendu disponible dans les versions antérieures du Framework MVC, grâce à l'attribut OutputCache, mais avec une limitation non négligeable. En effet, elle est basée sur la philosophie de rendu spécifique de Web Forms, et, en conséquence, embarquait les limitations suivantes :

  • pas de cache partiel possible : en effet, le cache de sortie cachant des contrôles serveur, qui ne sont (normalement) pas utilisés en MVC, il fallait se résoudre à soit cacher l'ensemble de la page, soit ne rien cacher du tout ;
  • contournement des filtres d'action : l'attribut OutputCache étant appelé en tout début de cycle de vie, il contournait la plupart des filtres d'action, ce qui pouvait produire des comportements non voulus.

Avec la version 3, il est désormais possible de cacher le résultat d'actions appelées par RenderAction depuis la page principale. Par exemple, supposons que nous voulions afficher à un utilisateur une zone lui souhaitant la bienvenue. Pour cela, on va commencer par créer, dans le répertoire Share, une nouvelle vue Meteo.cshtml:

<h2>Meteo</h2>
Dans la ville de @ViewBag.Ville, il fait @ViewBag.Temperature degrés.
<br />
<img src="@ViewBag.ImgSource" alt="Alternate Text" />

On va ensuite ajouter, dans notre contrôleur HomeController, une Action spécifique Meteo (en admettant qu'on ait une fonction GetCurrentMeteo, qui, pour une zone géographique, renvoie un objet météo) :

[ChildActionOnly]
public ActionResult Meteo(int zoneGeographique)
{
var meteo = GetCurrentMeteo(zoneGeographique);
ViewBag.Ville = meteo.Ville;
ViewBag.Temperature= meteo.Temperature;
ViewBag.ImgSource = meteo.ImgSource;

return PartialView();
}

Et, dans la page d'accueil, on va afficher cette page de météo de la façon suivante (en admettant qu'on ait mis dans le ViewBag la zone géographique de l'utilisateur) :

@{Html.RenderAction("Meteo", "Home", new { zoneGeographique = ViewBag.zoneGeographique });}

Finalement, on va activer le cache de sortie. Il nous suffira pour cela, dans le contrôleur, d'ajouter l'attribut OutputCache sur l'action Meteo, de le configurer pour varier par Zone, avec une expiration à 60 secondes, de la façon suivante :

[ChildActionOnly]
[OutputCache(Duration=60)]
public ActionResult Meteo(int zoneGeographique)
{

Et pendant la prochaine minute, aucun appel ne sera fait à Meteo.

On a aussi la possibilité de lier le rafraichissement des données au paramètre passé à l'action de la façon suivante :

[ChildActionOnly]
[OutputCache(Duration=600, VaryByParam = "zoneGeographique")]
public ActionResult Meteo(int zoneGeographique)
{

Le code ci-dessus permettra de ne rafraichir la vue qu'une fois toutes les 10 minutes, ou au changement de zone géographique.

Tags: , , , ,

Commentaires

1.
trackback ASP.NET Français Blogs says:

[ASP.NET MVC] Nouveautés MVC 3 Part 9 - Sessionless Controllers, Viewstart, IMetadataAware et ViewBag

ASP.NET MVC 3 apporte d'autres petites améliorations qu'il est important de noter : les

Les commentaires sont clos