Как очистить кеш HttpWebRequest - PullRequest
25 голосов
/ 10 февраля 2009

Я работаю против проприетарной библиотеки, и у меня возникают некоторые проблемы с кешем HttpWebRequest. Библиотека использует код, эквивалентный приведенному ниже, для выполнения запросов:

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

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

Внешний ресурс не запрещает кэширование, хотя каждый ответ отличается. Таким образом, я получаю один и тот же ответ каждый раз.

Есть ли способ очистить содержимое кэша HttpWebRequest? Правильным решением было бы исправить внешний источник или, возможно, изменить политику кэширования, но ни одно из них невозможно - отсюда и вопрос.

Очистка кэша может иметь различные последствия, поэтому желательно, чтобы решением было аннулировать кэш для каждого ресурса.

Ответы [ 5 ]

14 голосов
/ 12 марта 2009
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.

10 голосов
/ 16 июня 2012

HttpWebRequest использует System.Net.Cache.RequestCache для кэширования. Это абстрактный класс; фактическая реализация в Microsoft CLR - Microsoft.Win32.WinInetCache, которая, как следует из названия, использует для кэширования функции WinInet .

Это тот же кеш, который используется Internet Explorer, поэтому вы можете очистить кеш вручную, используя диалоговое окно IE Delete Browsing History. (Сделайте это сначала в качестве теста, чтобы убедиться, что очистка кэша WinInet решает вашу проблему.)

Предполагая, что очистка кэша WinInet решает проблему, вы можете программно удалять файлы, используя P / Invoking для DeleteUrlCacheEntry WinInet API:

public static class NativeMethods
{
    [DllImport("WinInet.dll", PreserveSig = true, SetLastError = true)]
    public static extern void DeleteUrlCacheEntry(string url);
}
1 голос
/ 02 апреля 2012

Я не пробовал, но решением может быть добавление произвольной строки запроса к запрашиваемому URL.

Эта строка запроса будет меняться каждый раз, возможно, с использованием DateTime.Now, что означает, что URL будет отличаться каждый раз Каждый запрос будет затем запрашиваться, предположительно, заново.

0 голосов
/ 07 декабря 2017

Добавьте следующую строку, чтобы очистить кэш по мере того, как веб-клиент извлекает данные:

Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")
0 голосов
/ 14 августа 2009

Вы можете изменить политику кэширования: использовать обратный прокси-сервер http и удалить / изменить соответствующие заголовки http. Это взлом, но это будет работать, и довольно легко. Я бы посоветовал вам использовать сервер Apache httpd для этой задачи (с mod_proxy).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...