2009-10-07 8 views
1

J'utilise une directive de page outputcache pour mettre en cache des valeurs basées sur VaryByParam. Existe-t-il un moyen de préremplir le cache lorsque l'application Web démarre pour un ensemble de paramètres communs, au lieu de devoir attendre que l'utilisateur clique sur la page? Ou ai-je juste besoin d'écrire un script qui frappe toutes les pages que je veux mettre en cache? Idéalement, je peux le faire côté serveur quelque part dans global.asax application_start?Comment est-ce que je préremplit le outputcache dans une application web asp.net?

Répondre

1

Dans le passé, j'ai utilisé des scripts warm up

http://programmerramblings.blogspot.com/2008/09/aspnet-site-warmup.html

Une solution comme celle-ci essentiellement "ping" jamais page. Ce "ping" provoquera l'activation de votre cache. Cela empêchera également les utilisateurs de se rendre sur le site Web froid, de sorte que les pages seront entièrement imprimées au moment où elles arriveront. Editer: Je ne sais toujours pas ce que je ressens à propos de l'odeur de la solution suivante, mais que diriez-vous de déclencher une demande Web au démarrage de l'application à chaque page?

string[] cachedPages = new string[] { "http://...", "http://...", ...}; 

foreach (var url in cachePages) { 
    var request = WebRequest.Create(url); 
    request.BeginGetResponse(null, null); 
} 
+0

Oui, cela fonctionnera, mais cela signifie que le script d'échauffement ne fait pas partie du programme application_start, qui est idéalement là où je le souhaite. Que faire si IIS est redémarré? Je suis dans une situation où je n'ai pas de contrôle sur la boîte où se trouve le site Web, donc je voudrais que tout soit autonome dans l'application serveur. –

+0

Je ne peux penser à des façons de type hacky pour l'obtenir au démarrage de l'application. En fonction des pages et du trafic vers le site, je peux créer une tâche planifiée sur ma machine locale pour exécuter une commande ping sur le site à intervalles fréquents. – Bob

+0

J'ai mis à jour ma réponse pour afficher un code simple pour faire un échauffement à partir du démarrage de l'application. Il semble que ça devrait marcher, mais quelque chose ne me semble pas juste. – Bob

-1

Pourquoi voudriez-vous mettre en cache des choses avant que quelqu'un ne les demande réellement? Cela ne fait-il pas aussi appel à des ressources? Je ne suis pas sûr si vous pouvez effectivement mettre en cache dynamiquement une page comme vous le dites, mais vous pouvez ajouter des objets au cache dans le fichier Global.asax.

void Application_Start(object sender, EventArgs e) 
{ 

} 
+0

Eh bien, dans ce scénario, je sais ce qu'ils vont demander. Oui, je sais que je peux ajouter la variable de cache, mais je veux ajouter à la sortiecache. –

+0

Comme il l'a mentionné, il cherche à préremplir le cache avec un ensemble de valeurs communes - des choses qu'il sait être demandées. De cette façon, lorsqu'un utilisateur frappe réellement le site avec cette requête, cet utilisateur ne subit pas de décalage pendant que l'élément est récupéré et mis en cache. – StriplingWarrior

2

vous êtes évidemment désireux d'une solution maintenant, mais un coup d'oeil à ce qui vient dans ASP.NET 4. Il y a deux nouveaux qui pourrait bien vous aider. La première est la possibilité de spécifier la logique «d'échauffement» pour les applications ASP.NET - vous configurez ceci dans le fichier web.config et vous lui dites éventuellement d'exécuter du code qui implémente IProcessHostPreloadClient. Voir ici pour les détails: http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx

La seconde est que vous obtiendrez un modèle de fournisseur approprié pour la mise en cache de sortie. Jusqu'à présent, il n'y avait qu'une seule option: la mise en cache dans le processus de travail. Donc, chaque fois qu'il y a un recyclage, vous perdez votre cache (et vous êtes bien sûr limité par des contraintes de mémoire). Dans ASP.NET 4, la mise en cache sur disque est également disponible. Voir ici pour plus de détails: http://www.asp.net/learn/whitepapers/aspnet40/#_TOC1_2

+0

Je ne crois pas que vous obtenez une mise en cache basée sur le disque de la boîte. Microsoft n'a jamais publié de cache sur disque - vous devez écrire votre propre implémentation de System.Web.Caching.OutputCacheProvider. –