2010-05-13 17 views
7

En mi aplicación ASP.NET utilizo HttpWebRequest para buscar recursos externos que me gustaría almacenar en caché. Considere el siguiente código:¿Cómo forzar a HttpWebRequest a utilizar el caché en el entorno 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 utiliza caché de IE, así que cuando lo ejecuto como usuario normal (en aplicación de prueba cmd minúscula), los datos se almacenan en caché a %userprofile%\Local Settings\Temporary Internet Files y siguientes respuestas se leen desde la memoria caché.

Pensé que cuando dicho código se ejecuta dentro de la aplicación ASP.NET, los datos se almacenarán en caché en ...\ASPNET\Local Settings\Temporary Internet Files pero no lo es y la caché nunca se usa.

¿Qué estoy haciendo mal? ¿Cómo forzar a HttpWebRequest a usar el caché en el entorno ASP.NET?

+0

Lo que cuenta es su aplicación ASP.NET ejecutando bajo? El caché se creará bajo esa cuenta. – feroze

+0

@feroze: la aplicación se está ejecutando en una cuenta ASPNET y conozco la ruta temporal de los archivos de Internet al examinar Environment.SpecialFolder.InternetCache. El problema no es que no sé dónde se crean las entradas de caché, pero no se crean en absoluto. – piotrsz

+0

Puede agregar una línea para cerrar y deshacerse del objeto de respuesta: resp.Close(); y luego verifica si sigues teniendo problemas? – feroze

Respuesta

0

Podría estar equivocado, pero sospecho que HttpWebRequest respeta los encabezados de caché del recurso, independientemente de sus deseos establecidos.

Compruebe los encabezados de respuesta y asegúrese de que el recurso no solicita explícitamente que no se almacene en caché.

+1

Sospechaba que también había encabezados, así que construí una pequeña aplicación de cmd que hace de httprequest el mismo recurso. En la aplicación de cmd está en la memoria caché. Y en la aplicación ASP.NET no lo es. – piotrsz

1

Usted puede utilizar la caché manualmente en su código como este:

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

Usted puede utilizar este método como si usara el almacenamiento en caché con en web.config.

+0

Probablemente terminaré implementando caché personalizada, pero esperaba una solución directa "lista para usar" ... – piotrsz

+0

Creo que no hay un problema inmediato, pero esto no debería ser un gran problema para implementar. – MUG4N

1

Sé que este es un hilo viejo, pero otra cosa a considerar con respecto a este tema es la configuración de seguridad de IE para la cuenta de usuario con la que se ejecuta la aplicación ASP.NET. El caché de HTTP (CachePolicy.Level = Predeterminado, recursos HTTP cacheables) no funcionaba para nuestra aplicación hasta que agregamos el host remoto a la lista de Sitios de confianza.

Este artículo fue útil para nuestra solución de problemas caché: http://blogs.msdn.com/b/ieinternals/archive/2011/03/19/wininet-temporary-internet-files-cache-and-explorer-folder-view.aspx

Cuestiones relacionadas