C # WebClient отключить кеш

Добрый день.

Я использую class WebClient в своем приложении C # для загрузки одного и того же файла каждую минуту, а затем приложение выполняет простую проверку, чтобы проверить, был ли файл изменен, и если он что-то делает с ним.

Ну, так как этот файл загружается каждую минуту, система кэширования WebClient кэширует файл, а не загружает файл снова, просто получая его из кеша, и это мешает проверять, загружен ли файл.

Поэтому я хотел бы знать, как можно отключить систему кэширования classа WebClient .

Я пробовал.

 Client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache); 

Я также пробовал заголовки.

 WebClient.Headers.Add("Cache-Control", "no-cache"); 

Не работает. Итак, как я могу отключить кеш навсегда?

Благодарю.

РЕДАКТИРОВАТЬ

Я также пробовал следующие CacheLevels : NoCacheNoStore , BypassCache , Reload . Никакого эффекта, однако, если я перезагружу свой компьютер, кеш, похоже, очищается, но я не могу перезагружать компьютер каждый раз.

UPDATE перед недавней активностью (8 Set 2012)

Ответ, отмеченный как принятый, решил мою проблему. Проще говоря, я использовал Sockets для загрузки файла и решил свою проблему. В принципе, запрос GET для нужного файла, я не буду вдаваться в подробности о том, как это сделать, потому что я уверен, что вы можете найти множество «как» прямо здесь, на SO, чтобы сделать то же самое. Хотя это не означает, что мое решение также наилучшее для вас, мой первый совет – прочитать другие ответы и посмотреть, полезны ли они.

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

В любом случае, если вы уверены, тогда в этом случае я советую проверять погоду, ваш запрос проходит через какое-то другое устройство с возможностями кэширования (компьютеры, маршрутизаторы, прокси, …), пока не дойдет до намеченного адресата.

Учтите, что большинство запросов проходят через некоторые из таких устройств, упомянутых ранее, чаще всего маршрутизаторы, если, конечно, вы напрямую не подключены к Интернету через вашу сеть поставщиков услуг.

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

И, кстати, общий совет, хотя он в основном относится к тем, кто работает на компьютерах разработки своей компании, а не их собственных. Можете ли какие-либо изменения на вашем компьютере разработки запустить кеширование? Возможно.

Кроме того, считайте, что многие веб-сайты или службы высокого уровня используют сети доставки контента (CDN), и в зависимости от поставщика CDN, всякий раз, когда файл обновляется или изменяется, требуется, чтобы такие изменения отражались во всей сети. Поэтому, возможно, вам не повезло просить файл, который может быть в середине обновления, а ближайший сервер CDN для вас не закончил обновление.

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

И если вы рассматриваете такой вариант, я думаю, вам, вероятно, будет легче создавать REST Style Web API для ваших собственных нужд.

Я надеюсь, что это обновление будет вам каким-то полезным, конечно, это будет для меня, когда я вернусь. Удачи вам в ваших усилиях по кодированию.

12 Solutions collect form web for “C # WebClient отключить кеш”

Из вышеизложенного я предполагаю, что у вас проблемы в другом месте. Можете ли вы протоколировать HTTP-запросы на стороне сервера? Что вы получаете, когда изменяете какой-либо случайный параметр семени?

Может быть, SERVER кэширует файл (если журнал показывает, что запрос действительно запускается каждую минуту.

Используете ли вы ISA или SQUID?

Что такое код ответа HTTP для вашего запроса?

Я знаю, что ответ с ответами может быть не очень популярен, но комментарий не позволяет мне так много текста 🙂

РЕДАКТИРОВАТЬ:

В любом случае, используйте объект HttpRequest вместо WebClient , и, надеюсь (если вы поместите свои сомнения в WebClient ), все будет решено. Если это не было разрешено с помощью HttpRequest , тогда проблема действительно находится где-то в другом месте.

Дальнейшее уточнение:

Перейти еще ниже: Как создать HTTP-запрос вручную в .Net?

Это чистые сокеты, и если проблема все еще сохраняется, тогда откройте новый вопрос и пометьте его WTF 🙂

Вы можете попробовать добавить случайное число к вашему URL-адресу в качестве части запроса при каждом скачивании файла. Это гарантирует, что URL-адреса уникальны каждый раз.

Для экс-

 Random random = new Random(); string url = originalUrl + "?random=" + random.Next().ToString(); webclient.DownloadFile(url, downloadedfileurl); 

Попробуйте NoCacheNoStore :

Никогда не удовлетворяет запросу с использованием ресурсов из кеша и не кэширует ресурсы. Если ресурс присутствует в локальном кеше, он удаляется. Этот уровень политики указывает промежуточным кэшам, что они должны удалить ресурс. В протоколе кеширования HTTP это достигается с помощью директивы управления кэшем кэширования.

 client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); 

В некоторых сценариях сетевое отладочное программное обеспечение может вызвать эту проблему. Чтобы ваш URL не был кэширован, вы можете добавить случайное число в качестве последнего параметра, чтобы сделать URL уникальным. Этот случайный параметр в большинстве случаев игнорируется серверами (которые пытаются считывать параметры, отправленные как пары значений имени).

Пример: http://www.someserver.com/?param1=val1&ThisIsRandom=RandomValue

Где ThisIsRandom = RandomValue – новый добавленный параметр.

Я думаю, вам придется использовать webrequest / webresponse, а не webclient

  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(); //below is the function for downloading the file public static int DownloadFile(String remoteFilename, String localFilename) { // Function will return the number of bytes processed // to the caller. Initialize to 0 here. int bytesProcessed = 0; // Assign values to these objects here so that they can // be referenced in the finally block Stream remoteStream = null; Stream localStream = null; WebResponse response = null; // Use a try/catch/finally block as both the WebRequest and Stream // classes throw exceptions upon error try { // Create a request for the specified remote file name WebRequest request = WebRequest.Create(remoteFilename); // Define a cache policy for this request only. HttpRequestCachePolicy noCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore); request.CachePolicy = noCachePolicy; if (request != null) { // Send the request to the server and retrieve the // WebResponse object response = request.GetResponse(); if (response != null) { if (response.IsFromCache) //do what you want // Once the WebResponse object has been retrieved, // get the stream object associated with the response's data remoteStream = response.GetResponseStream(); // Create the local file localStream = File.Create(localFilename); // Allocate a 1k buffer byte[] buffer = new byte[1024]; int bytesRead; // Simple do/while loop to read from stream until // no bytes are returned do { // Read data (up to 1k) from the stream bytesRead = remoteStream.Read(buffer, 0, buffer.Length); // Write the data to the local file localStream.Write(buffer, 0, bytesRead); // Increment total bytes processed bytesProcessed += bytesRead; } while (bytesRead > 0); } } } catch (Exception e) { Console.WriteLine(e.Message); } finally { // Close the response and streams objects here // to make sure they're closed even if an exception // is thrown at some point if (response != null) response.Close(); if (remoteStream != null) remoteStream.Close(); if (localStream != null) localStream.Close(); } // Return total bytes processed to caller. return bytesProcessed; } 
 client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache); 

Должно сработать. Просто убедитесь, что вы очистили кеш и удалили временные загруженные файлы в Internet Explorer, прежде чем запускать код, поскольку System.Net и IE используют один и тот же кеш.

У меня была аналогичная проблема с powershell с использованием webClient, которая также присутствовала после переключения на использование webRequest. Я обнаружил, что сокет повторно используется и вызывает все виды кеширования на стороне сервера / сети (и в моем случае балансировка нагрузки слишком затруднилась с https). Путь вокруг этого состоит в том, чтобы отключить keepalive и, возможно, выполнить пинтинг в объекте webrequest, как показано ниже, что заставит новый сокет для каждого запроса:

 #Define Funcs Function httpRequest { param([string]$myurl) $r = [System.Net.WebRequest]::Create($myurl) $r.keepalive = 0 $sr = new-object System.IO.StreamReader (($r.GetResponse()).GetResponseStream()) $sr.ReadToEnd() } 

Использование HTTPRequest , безусловно, является правильным ответом на вашу проблему. Однако, если вы хотите, чтобы ваш веб-браузер WebBrowser / WebClient использовал кешированные страницы, вы должны включить не только "no-cache" но и все эти заголовки:

     

В IE11 это не сработало для меня, пока я не включил ни один, ни оба из последних двух.

Все методы здесь не могут решить проблему: если веб-страница когда-либо была доступна и теперь удалена с сервера, метод HttpWebResponse.GetResponse () даст вам ответ на кешированную копию, начиная с «До периода достаточного прошло время, или вы перезагрузите компьютер, он НЕ запускает ожидаемое исключение для 404 страницы, не найденной ошибкой, вы не можете знать, что веб-страница сейчас вообще не exsit.

Я пробовал все:

  • Установите заголовок как («Cache-Control», «no-cache»)
  • Установите для параметра “request.CachePolicy” значение “noCachePolicy”
  • Удалить файлы IE tem / history.
  • Использовать проводной Интернет без маршрутизатора ………. НЕ РАБОТАЕТ!

К счастью, если веб-страница изменила свой контент, HttpWebResponse.GetResponse() предоставит вам новую страницу, отражающую изменение.

Убедитесь, что вы не ограничены ставками! Я возвращал это с сервера nginx:

403 Запрещено

Превышена ограниченная скорость, повторите попытку через 24 часа.

Вот программа, которую я использовал (C #)

 using System; using System.IO; using System.Net; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { DownloadFile(); Console.ReadLine(); } public static void DownloadFile() { var downloadedDatabaseFile = Path.Combine(Path.GetTempPath(), Path.GetTempFileName()); Console.WriteLine(downloadedDatabaseFile); var client = new WebClient(); client.DownloadProgressChanged += (sender, args) => { Console.WriteLine("{0} of {1} {2}%", args.BytesReceived, args.TotalBytesToReceive, args.ProgressPercentage); }; client.DownloadFileCompleted += (sender, args) => { Console.WriteLine("Download file complete"); if (args.Error != null) { Console.WriteLine(args.Error.Message); } }; client.DownloadFileAsync(new Uri("http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dats.gz"), downloadedDatabaseFile); } } } 

Консоль выдает:

 C:\Users\jake.scott.WIN-J8OUFV09HQ8\AppData\Local\Temp\2\tmp7CA.tmp Download file complete The remote server returned an error: (403) Forbidden. 

поскольку я использую следующее:

 wclient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); wclient.Headers.Add("Cache-Control", "no-cache"); 

Я больше не получаю кешированный файл.

Я добавил эту функцию, которую я нашел, чтобы удалить файлы IE temp перед каждым вызовом:

 private void del_IE_files() { string path = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); //for deleting files System.IO.DirectoryInfo DInfo = new DirectoryInfo(path); FileAttributes Attr = DInfo.Attributes; DInfo.Attributes = FileAttributes.Normal; foreach (FileInfo file in DInfo.GetFiles()) { file.Delete(); } foreach (DirectoryInfo dir in DInfo.GetDirectories()) { try { dir.Delete(true); //delete subdirectories and files } catch { } } } 

Если у вас есть доступ к веб-серверу, откройте Internet Explorer.

Internet Explorer -> Internet Options -> Browsing History "Settings" -> Temporary Internet Files "never"

Очистите кэш браузера и вуаля, он будет работать!

  • Возможно ли передать аутентификацию из Webbrowser в WebRequest
  • WebClient vs. HttpWebRequest / HttpWebResponse
  • POSTing JSON для URL через WebClient в C #
  • Как мне войти на сайт с помощью WebClient?
  • Использование WebClient или WebRequest для входа на веб-сайт и доступа к данным
  • ASP.NET-controller: asynchronous модуль или обработчик завершен, пока асинхронная операция все еще находится на рассмотрении
  • Войдите на сайт, через C #
  • Выбор между HttpClient и WebClient
  • C # - Как сделать HTTP-вызов
  • Как изменить таймаут на объекте .NET WebClient
  • HTTP POST возвращает ошибку: 417 «Ожидание не выполнено».
  • Interesting Posts

    Почему фильтры источника Perl плохие, и когда их использовать?

    Сообщения ядра ядра на другой процесс по мере их возникновения

    C # 4.0, необязательные параметры и параметры не работают вместе

    Как разбить строку в оболочке и получить последнее поле

    Как проверить, ответил ли ping или нет в пакетном файле

    Диспетчер сценариев Excel

    Базовая (дешевая) рекомендация беспроводного маршрутизатора для дома

    Настройка ведения журнала Hibernate с использованием файла конфигурации XML Log4j?

    Почему 64-разрядные DLL-файлы идут в System32 и 32-разрядные библиотеки DLL на SysWoW64 в 64-разрядной Windows?

    Как найти поставщика и модель неизвестных драйверов

    Как нарисовать дерево, представляющее график подключенных узлов?

    @ font-face работает в IE8, но не IE9

    Как я могу эффективно определить, является ли многоугольник выпуклым, невыпуклым или сложным?

    Какой источник питания мне нужен для поддержки моей системы?

    Получение исключения (org.apache.poi.openxml4j.exception – нет типа содержимого ) при чтении файла xlsx с использованием Apache POI?

    Давайте будем гением компьютера.