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

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

Добрый день.

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

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

Итак, я хотел бы знать, как отключить систему кэширования класса 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)

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

EDIT:

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

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

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

Это чистые сокеты, и если проблема по-прежнему сохраняется, откройте новый вопрос и пометьте его WTF:)

Ответ 2

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

Для ex -

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Я думаю, вам придется использовать 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 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;
    }

Ответ 6

client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);

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

Ответ 7

У меня была аналогичная проблема с 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() }

Ответ 8

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

<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Cache-control" content="no-store">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">

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

Ответ 9

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

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

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

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

Ответ 10

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

403 Запрещено

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

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

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.

Ответ 11

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

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

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

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

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
        {

        }
    }
}

Ответ 12

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

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

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