2009-02-10 18 views
21

Estoy desarrollando en contra de una biblioteca patentada y estoy experimentando algunos problemas con el caché del HttpWebRequest. La biblioteca está utilizando código equivalente a la de abajo para hacer las solicitudes:Cómo borrar el caché de HttpWebRequest

var request = WebRequest.Create("http://example.com/") as HttpWebRequest; 

request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 

El recurso externo no prohíbe el almacenamiento en caché aunque cada respuesta diferente. Por lo tanto, termino recibiendo la misma respuesta cada vez.

¿Hay alguna manera de borrar el contenido de la memoria caché HttpWebRequest? La solución correcta sería arreglar la fuente externa o quizás cambiar la política de caché, pero ninguna es posible, de ahí la pregunta.

La eliminación de la memoria caché puede tener varios impactos, por lo que la solución sería invalidar la memoria caché por recurso.

+0

¿Cuál fue la respuesta a esto? La respuesta de Bradley es lo que pensé que era correcto, pero empíricamente he encontrado que limpiar el caché de IE (y usar el Fiddler) no funciona. –

+0

Sé que esto fue preguntado hace un tiempo, pensé que esta pregunta [Borrar la memoria caché de la página en ASP.Net] (http://stackoverflow.com/a/11641/128984) podría ser de alguna ayuda también. – Micah

Respuesta

12
public static WebResponse GetResponseNoCache(Uri uri) 
{ 
     // Set a default policy level for the "http:" and "https" schemes. 
     HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default); 
     HttpWebRequest.DefaultCachePolicy = policy; 
     // Create the request. 
     WebRequest request = WebRequest.Create(uri); 
     // Define a cache policy for this request only. 
     HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore); 
     request.CachePolicy = noCachePolicy; 
     WebResponse response = request.GetResponse(); 
     Console.WriteLine("IsFromCache? {0}", response.IsFromCache);    
     return response; 
} 

Puede establecer la Política de caché para la solicitud de NoCacheNoStore a HttpWebRequest.

+1

Como se indicó, no es posible cambiar la política de caché. Me gustaría una solución para borrar realmente la memoria caché, sin evitar el almacenamiento en caché por completo. –

+0

Creo que CyberMing es correcto. NoCacheNoStore realmente borrará la tienda de caché para la URL solicitada, ¿y realmente puede ser lo que estás buscando? > (de la documentación) HttpRequestCacheLevel.NoCacheNoStore ... Nunca satisface una solicitud utilizando recursos de la memoria caché y no almacena el recurso en caché. ** Si el recurso está presente en la memoria caché local, se elimina ** ... – snowcode

+0

Estaba buscando cómo saber de dónde viene la respuesta (desde el caché o no, porque el estado siempre es 200 como si no hubiera caché en el que se usa) y me da la respuesta: IsFromcache. Gracias. – MuiBienCarlota

0

Puede cambiar la política de caché: utilice un proxy inverso HTTP y elimine/cambie los encabezados http pertinentes. Es un truco, pero funcionaría, y bastante fácil. Te sugiero que uses el servidor httpd de Apache para esta tarea (con mod_proxy).

1

No lo he intentado, pero una solución podría ser agregar una cadena de consulta arbitraria a la url solicitada.

Esta cadena de consulta cambiaría cada vez, tal vez usando DateTime.Now, lo que significa que la URL sería diferente cada vez. Cada solicitud sería solicitada supuestamente de nuevo.

10

HttpWebRequest utiliza System.Net.Cache.RequestCache para el almacenamiento en caché. Esto es una clase abstracta; la implementación real en Microsoft CLR es Microsoft.Win32.WinInetCache que, como su nombre lo indica, usa las funciones WinInet para el almacenamiento en caché.

Este es el mismo caché utilizado por Internet Explorer, por lo que puede borrar manualmente el caché mediante el cuadro de diálogo Eliminar historial de navegación de IE. (Haga esto por primera vez como una prueba, para asegurarse de borrar la memoria caché de WinInet resuelve su problema.)

Suponiendo que borrar la memoria caché de WinInet resuelve el problema, puede eliminar archivos mediante programación P/Al invocar a la API DeleteUrlCacheEntry WinInet:

public static class NativeMethods 
{ 
    [DllImport("WinInet.dll", PreserveSig = true, SetLastError = true)] 
    public static extern void DeleteUrlCacheEntry(string url); 
} 
+0

Tiene razón, Microsoft.Win32.WinInetCache está involucrado y la respuesta se lee de Microsoft.Win32.WinInetCache.ReadStream, pero no significa que es la misma ubicación de caché que IE. – MuiBienCarlota

+3

@MuiBienCarlota: En la práctica, he encontrado que sí lo es. Hasta donde yo sé, Internet Explorer todavía usa las funciones de caché de WinInet; si tanto él como .NET se ejecutan bajo la misma cuenta de usuario, los archivos creados/eliminados por 'CreateUrlCacheEntry' y' DeleteUrlCacheEntry' deberían estar en el mismo lugar. –

-1

Añadir la siguiente línea a borrar la memoria caché como y cuando el Cliente web obtiene los datos:

Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache") 
Cuestiones relacionadas