2010-05-13 2 views
7

Dans mon application ASP.NET, j'utilise HttpWebRequest pour extraire les ressources externes que je souhaite mettre en cache. Considérez le code suivant:Comment forcer HttpWebRequest à utiliser le cache dans un environnement ASP.NET?

var req = WebRequest.Create("http://google.com/"); 
req.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 
var resp = req.GetResponse(); 
Console.WriteLine(resp.IsFromCache); 
var answ = (new StreamReader(resp.GetResponseStream())).ReadToEnd(); 
Console.WriteLine(answ.Length); 

HttpWebRequest utilise le cache IE, donc quand je le lance en tant qu'utilisateur normal (en minuscule application de test de cmd), les données sont mises en cache à %userprofile%\Local Settings\Temporary Internet Files et les réponses suivantes sont lues à partir du cache.

Je pensais que lorsqu'un tel code est exécuté dans l'application ASP.NET, les données seront mises en cache à ...\ASPNET\Local Settings\Temporary Internet Files mais ce n'est pas le cas et le cache n'est jamais utilisé.

Qu'est-ce que je fais mal? Comment forcer HttpWebRequest à utiliser le cache dans l'environnement ASP.NET?

+0

Quel compte est votre application ASP.NET en cours d'exécution sous? Le cache sera créé sous ce compte. – feroze

+0

@feroze: L'application fonctionne sous un compte ASPNET et je connais le chemin des fichiers Internet temporaires à partir de l'examen de Environment.SpecialFolder.InternetCache. Le problème n'est pas que je ne sais pas où les entrées de cache sont créées mais elles ne sont pas créées du tout. – piotrsz

+0

Pouvez-vous ajouter une ligne pour fermer et disposer l'objet réponse: resp.Close(); puis vérifiez si vous rencontrez toujours des problèmes? – feroze

Répondre

0

Je peux me tromper mais je suspecte que HttpWebRequest respecte les en-têtes de cache de la ressource indépendamment de vos désirs indiqués.

Vérifiez les en-têtes de réponse et assurez-vous que la ressource ne demande pas explicitement de ne pas être mise en cache.

+1

J'ai aussi suspecté les en-têtes, donc je construis une petite application de cmd qui fait httprequest à la même ressource. Dans l'application cmd, il est mis en cache. Et dans l'application ASP.NET ce n'est pas le cas. – piotrsz

1

Vous pouvez utiliser le cache manuellement dans votre code comme ceci:

Cache.Insert("request", req, Nothing, DateTime.Now, TimeSpan.FromSeconds(30), TimeSpan.Zero) 

Vous pouvez utiliser cette méthode comme vous utilisez la mise en cache avec dans web.config.

+0

Je finirai probablement par implémenter le cache personnalisé, mais j'espérais une solution "prête à l'emploi" simple ... – piotrsz

+0

Je pense qu'il n'y a pas de problème pour votre problème, mais cela ne devrait pas être un gros problème mettre en place. – MUG4N

1

Je sais que c'est un ancien thread, mais une autre chose à considérer à propos de ce problème est les paramètres de sécurité IE pour le compte d'utilisateur que l'application ASP.NET est en cours d'exécution. La mise en cache HTTP (CachePolicy.Level = par défaut, les ressources pouvant être mises en cache HTTP) ne fonctionnait pas pour notre application tant que nous n'avions pas ajouté l'hôte distant à la liste des sites approuvés.

Cet article a été utile pour notre dépannage cache: http://blogs.msdn.com/b/ieinternals/archive/2011/03/19/wininet-temporary-internet-files-cache-and-explorer-folder-view.aspx

Questions connexes