Подтвердить что ты не робот

Как очистить кэш HttpWebRequest

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

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

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

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

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

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

4b9b3361

Ответ 1

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.

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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