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

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

27 голосов
/ 28 сентября 2010

Добрый день.

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

Хорошо, поскольку этот файл загружается каждую минуту, система кэширования 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.Однако безрезультатно, если я перезагружаю свой компьютер, кэш, кажется, очищается, но я не могу каждый раз перезагружать компьютер.

ОБНОВЛЕНИЕ перед лицом недавних действий (8 Set 2012)

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

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

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

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

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

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

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

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

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

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

Ответы [ 12 ]

0 голосов
/ 03 июля 2012

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

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
        {

        }
    }
}
0 голосов
/ 15 мая 2012

Убедитесь, что вы не ограничены в скорости! Я получил это обратно с сервера 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.
...