Как очистить кеш HttpWebRequest
Я работаю против проприетарной библиотеки и испытываю некоторые проблемы с кешем HttpWebRequest
, Библиотека использует код, эквивалентный приведенному ниже, для выполнения запросов:
var request = WebRequest.Create("http://example.com/") as HttpWebRequest;
request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable);
Внешний ресурс не запрещает кэширование, хотя каждый ответ отличается. Таким образом, я получаю один и тот же ответ каждый раз.
Есть ли способ очистить содержимое HttpWebRequest
кэш? Правильным решением было бы исправить внешний источник или, возможно, изменить политику кэширования, но ни то, ни другое невозможно - отсюда и вопрос.
Очистка кеша может иметь различные последствия, поэтому желательно, чтобы решением было сделать кеш недействительным для каждого ресурса.
5 ответов
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;
}
Вы можете установить политику кэширования для запроса на NoCacheNoStore для HttpWebRequest.
HttpWebRequest
использования System.Net.Cache.RequestCache
для кеширования. Это абстрактный класс; фактическая реализация в Microsoft CLR Microsoft.Win32.WinInetCache
который, как следует из названия, использует функции WinInet для кэширования.
Это тот же кеш, который используется Internet Explorer, поэтому вы можете очистить кеш вручную, используя диалоговое окно IE Delete Browsing History. (Сделайте это сначала в качестве теста, чтобы убедиться, что очистка кэша WinInet решает вашу проблему.)
Предполагая, что очистка кеша WinInet решает проблему, вы можете удалить файлы программно, используя P / Invoking для API-интерфейса WinInet DeleteUrlCacheEntry:
public static class NativeMethods
{
[DllImport("WinInet.dll", PreserveSig = true, SetLastError = true)]
public static extern void DeleteUrlCacheEntry(string url);
}
Я не пробовал, но решением может быть добавление произвольной строки запроса к запрашиваемому URL.
Эта строка запроса будет меняться каждый раз, возможно, с использованием DateTime.Now, что означает, что URL будет отличаться каждый раз. Каждый запрос будет затем запрашиваться, предположительно, заново.
Вы можете изменить политику кэширования: использовать обратный прокси-сервер http и удалить / изменить соответствующие заголовки http. Это взлом, но это будет работать, и довольно легко. Я бы посоветовал вам использовать сервер Apache httpd для этой задачи (с mod_proxy).
Добавьте следующую строку, чтобы очистить кэш по мере того, как веб-клиент извлекает данные:
Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")