Cómo borrar el caché de HttpWebRequest

Estoy desarrollando una biblioteca propietaria y estoy experimentando algunos problemas con la memoria caché de HttpWebRequest . La biblioteca utiliza un código equivalente al siguiente para realizar las solicitudes:

 var request = WebRequest.Create("http://example.com/") as HttpWebRequest; request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 

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

¿Hay alguna manera de borrar el contenido de la HttpWebRequest 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é podría tener varios impactos, por lo que la solución sería invalidar la memoria caché por recurso.

 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 configurar la Política de caché para la solicitud de NoCacheNoStore a HttpWebRequest.

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 de 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 primero como prueba, para asegurarse de que borrar el caché de WinInet resuelve su problema).

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

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

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.

Puede cambiar la política de caché: use 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).

Agregue la siguiente línea para borrar la caché y cuando el cliente web obtenga los datos:

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