Partager via


Mise en cache de parties d'une page ASP.NET

Mise à jour : novembre 2007

Il peut parfois se révéler peu pratique de mettre en cache une page entière, car des parties de la page doivent peut-être être modifiées pour chaque demande. Dans ces cas, vous pouvez ne mettre en cache qu'une partie de la page. Vous avez le choix entre deux options : la mise en cache du contrôle et la substitution post-cache.

La mise en cache du contrôle, également appelée mise en cache par fragments, permet de mettre en cache des parties de la sortie de page en créant des contrôles utilisateur pour contenir le contenu mis en cache et en marquant ces contrôles utilisateur comme pouvant être mis en cache. Cela permet la mise en cache du contenu spécifique d'une page chaque fois que la page entière est recréée. Par exemple, si vous créez une page qui affiche un contenu principalement dynamique, comme les informations boursières, mais qui possède également des sections statiques, comme les synthèses hebdomadaires, vous pouvez créer les sections statiques dans les contrôles utilisateur et configurer ceux-ci pour qu'ils soient mis en cache.

La substitution post-cache fonctionne de façon inverse. La page est mise en cache, mais des fragments de la page sont dynamiques et ne doivent donc pas être mis en cache. Par exemple, si vous créez une page entièrement statique pour des périodes définies, par exemple une page d'articles de presse, vous pouvez configurer la page entière pour qu'elle soit mise en cache. Si vous avez ajouté des bannières publicitaires pivotantes à la page mise en cache, elles ne changent pas entre les demandes de page. Toutefois, la page peut être mise en cache avec la substitution post-mise en cache, mais vous pouvez marquer des parties spécifiques comme ne pouvant pas être mises en cache. Dans l'exemple, vous marquez vos bannières publicitaires comme ne pouvant pas être mises en cache. Elles sont ensuite créées dynamiquement pour chaque demande de page et ajoutées à la sortie de la page mise en cache. Pour plus d'informations sur la substitution post-mise en cache, consultez Mise à jour dynamique de portions d'une page mise en cache.

Mise en cache du contrôle

La création de contrôles utilisateur pour mettre en cache du contenu vous permet de séparer les parties d'une page dont la création consomme un temps processeur précieux, comme les requêtes de base de données, des autres parties de la page. Les parties de la page qui requièrent moins de ressources serveur peuvent être générées dynamiquement pour chaque demande.

Une fois que vous avez identifié les parties de la page que vous souhaitez mettre en cache et créé les contrôles utilisateur qui contiennent chacun de ces parties, vous devez établir les stratégies de mise en cache de ces contrôles. Vous pouvez définir de façon déclarative ces stratégies à l'aide de la directive @ OutputCache ou de la classe PartialCachingAttribute du code pour le contrôle utilisateur.

Par exemple, si vous incluez la directive suivante au début d'un fichier de contrôle utilisateur (fichier .ascx), une version du contrôle est stockée dans le cache de sortie pendant 120 secondes.

<%@ OutputCache Duration="120" VaryByParam="None" %>

Si vous souhaitez définir des paramètres de mise en cache dans le code, vous pouvez utiliser un attribut de la déclaration de classe du contrôle utilisateur. Par exemple, si vous incluez l'attribut suivant dans les métadonnées de votre déclaration de classe, une version du contenu dans le cache de sortie est stockée pendant 120 secondes :

[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
    // Class Code
}
<PartialCaching(120)> _
Partial Class CachedControl
    Inherits System.Web.UI.UserControl
    ' Class Code
End Class

Pour plus d'informations sur les attributs que vous pouvez définir pour la sortie d'une page, consultez la rubrique @ OutputCache. Pour plus d'informations sur la création de contrôles utilisateur, consultez Vue d'ensemble des contrôles serveur Web ASP.NET.

Remarque :

Dans la mesure où vous pouvez imbriquer des contrôles utilisateur dans une page, vous pouvez également imbriquer des contrôles utilisateur qui ont été placés dans le cache de sortie. Vous pouvez spécifier différents paramètres de mise en cache pour la page et pour les contrôles utilisateur imbriqués.

Référencement par programme des contrôles utilisateur mis en cache

Lorsque vous créez un contrôle utilisateur pouvant être mis en cache de façon déclarative, vous pouvez inclure un attribut ID pour référencer par programme cette instance du contrôle utilisateur. Toutefois, vous devez vérifier l'existence du contrôle utilisateur dans le cache de sortie avant de le référencer dans le code. Un contrôle utilisateur mis en cache est généré dynamiquement pour la première demande uniquement ; les demandes suivantes sont satisfaites à partir du cache de sortie jusqu'à ce que le délai spécifié arrive à expiration. Une fois que vous avez déterminé que le contrôle utilisateur a été instancié, vous pouvez le manipuler par programme à partir de la page conteneur. Par exemple, si vous assignez de façon déclarative à un contrôle utilisateur une propriété ID ayant la valeur SampleUserControl, vous pouvez vérifier son existence avec le code suivant :

protected void Page_Load(object sender, EventArgs e)
{
    if (SampleUserControl != null)
       // Place code manipulating SampleUserControl here.
}
Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    If SampleUserControl <> Nothing Then
       ' Place code manipulating SampleUserControl here.
    End If
End Sub

Mise en cache de la page et des contrôles utilisateur pour différentes durées

Vous pouvez définir différentes valeurs de durée de mise en cache de la sortie pour une page et pour des contrôles utilisateur de la page. Si la durée de mise en cache de la sortie de page est supérieure à celle du contrôle utilisateur, elle a la priorité. Par exemple, si la mise en cache de la sortie de page a la valeur 100 secondes et que la mise en cache de la sortie de contrôle utilisateur a la valeur 50 secondes, la page entière, y compris le contrôle utilisateur, est stockée dans le cache de sortie pendant 100 secondes, même si la valeur du contrôle utilisateur est inférieure.

L'exemple de code suivant affiche les conséquences d'une mise en cache plus longue dans la page que dans le contrôle utilisateur. La page est configurée pour être mise en cache pendant 100 secondes.

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

L'exemple de code suivant présente le contrôle utilisateur contenu dans la page. La durée de mise en cache pour le contrôle est fixée à 50 secondes.

<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Toutefois, si la durée de mise en cache de la sortie de page est inférieure à celle du contrôle utilisateur, le contrôle utilisateur est mis en cache jusqu'à expiration de sa durée, même si le reste de la page est régénéré pour une demande. Par exemple, si la mise en cache de la sortie de page est fixée à 50 secondes et celle du contrôle utilisateur à 100 secondes, le contrôle utilisateur expire une fois toutes les deux expirations du reste de la page.

Le code suivant présente la balise d'une page contenant un contrôle utilisateur dont la durée de mise en cache est supérieure à celle de la page. La page est configurée pour être mise en cache pendant 50 secondes.

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="Uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Le code suivant présente le contrôle utilisateur contenu dans la page. La durée de mise en cache pour le contrôle est fixée à 100 secondes.

<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Voir aussi

Concepts

Vue d'ensemble de la mise en cache ASP.NET

Mise à jour dynamique de portions d'une page mise en cache

Mise en cache de plusieurs versions d'une page

Mise en cache de données d'application

Configuration du cache dans ASP.NET

Autres ressources

Nouveautés dans la mise en cache ASP.NET