2009-07-21 5 views
5

J'essaie de comprendre le mécanisme ASP.NET OutputCache.
J'ai construit une page de test avec un Label et un LinkButton.
Le texte de l'étiquette est en cours d'initialisation sur le serveur avec la date actuelle du serveur sur chaque PageLoad:ASP.NET OutputCache et les publications

protected void Page_Load(object sender, EventArgs e) 
{ 
    lblDate.Text = DateTime.Now.ToString(); 
} 

je la présente directive: <%@ OutputCache Duration="600" VaryByParam="none"%>

Lorsque je presse le LinkButton la première fois que je reçois un nouveau texte dans l'étiquette mais si j'appuie à nouveau sur le bouton de lien, je n'obtiens pas de nouveau texte. Je suppose que cela est dû aux paramètres qui sont transférés au serveur qui sont les mêmes pour chaque publication.

Existe-t-il un moyen de travailler avec les contrôles OutputCach et de publication?

Répondre

6

droit, la chose que vous est êtes variable par aucun paramètre si le html de réponse de la première requête est mise en mémoire cache et servi pour les 10 prochaines minutes (en théorie). Si vous voulez mettre en cache des GET mais traiter des POST différents, vous devez varier en fonction de vos paramètres POST. Laissez-moi vous donner un exemple.

Vous avez une entrée de texte utilisée pour envoyer un e-mail avec son contenu sur POST. Si vous changez par ce nom d'entrée, chaque requête dans la période de mise en cache avec des valeurs différentes pour cette entrée de texte frapperait votre gestionnaire et traiterait l'envoi de l'email. De l'autre côté, vous pouvez varier de * mais vous risquez de perdre la mise en cache en mode noyau.

+0

Pouvez-vous publier un exemple hot pour utiliser mes paramètres de publication en tant que VaryByParam? – lnetanel

+0

sûr, <% @ OutputCache Duration = "600" VaryByParam = "YourPostParam1, YourPostParam2, (tous les paramètres GET également), ..."%> – user134706

+0

Vous avez tout simplement compris cela avant de trouver ce post - nous avons en fait eu un problème avec un déploiement en direct parce que nous avions VaryByParam mis à "aucun" où les pages postées à eux-mêmes! –

2

Vous avez raison dans vos hypothèses.

Votre directive OutputCache indique au mécanisme de mise en cache de sortie de mettre en cache l'intégralité de la page rendue pour une URL spécifique, pendant 600 secondes. Dans votre exemple simple, vous n'utilisez probablement aucune chaîne de requête, cependant, la déclaration VaryByParam dans la directive vous permet de spécifier un paramètre de chaîne de requête qui garantit que chaque valeur différente de ce paramètre est mise en cache séparément. Par exemple, si vous aviez:

<%@ OutputCache Duration="600" VaryByParam="ProductID"%> 

alors ces trois paramètres différents, seraient tous mis en cache individuellement URL, et en changeant la valeur de la « ProductID » à quelque chose ne serait pas encore mis en cache en sorte que la page est traitée et rendue par correctement l'exécution ASP.NET:

http://www.example.com/viewproduct.aspx?ProductID=123 
http://www.example.com/viewproduct.aspx?ProductID=3 
http://www.example.com/viewproduct.aspx?ProductID=67 

dans votre exemple, sur votre bouton clic, la page a déjà été rendue précédemment (et mises en cache) et lorsque vous postez à nouveau il n'y a pas de différence dans l'URL que vous êtes En effet, l'exécution d'ASP.NET vous affichera la page mise en cache sans passer par le Le processus de re-rendu. En dehors de la modification de la valeur d'un paramètre "VaryByParam", la directive OutputCache est plutôt une approche "tout ou rien" de la mise en cache des pages. Toutefois, il existe un attribut "VaryByContol" pour la directive, qui ne peut être utilisé que dans les contrôles utilisateur ASP.NET, plutôt que dans une page Web ASP.NET complète.

De votre question, il semble plus que vous avez besoin d'enquêter partiel mise en cache des pages. Soit cela ou un mécanisme pour invalider le cache quand un événement se produit. Cela est généralement fait en ajoutant une "dépendance de cache".

Pour cela, les liens suivants devraient aider:

Caching Portions of an ASP.NET Page
Tip/Trick: Implement "Donut Caching" with the ASP.NET 2.0 Output Cache Substitution Feature
Programmatically Removing a Page from the OutputCache