代码之家  ›  专栏  ›  技术社区  ›  Fábio Antunes

C#WebClient禁用缓存

  •  26
  • Fábio Antunes  · 技术社区  · 14 年前

    很好的一天。

    我用的是 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套2012)

    answer 标记为已接受解决了我的问题。简单地说,我用 套接字下载文件,解决了我的问题。基本上是一个得到 请求所需的文件,我不会详细说明如何做, 你自己也要这么做。虽然这并不意味着我的解决方案对你来说也是最好的,但我的第一个建议是阅读其他答案,看看有没有有用的。

    好吧,不管怎样,因为这个问题已经看到了一些最近的活动,我想添加这个更新,包括一些提示或想法,我认为应该考虑那些面临类似问题的人谁尝试 所有他们能想到的,并且确信问题不存在 他们的代码。 可能是大多数情况下的代码,但有时我们只是看不太清楚,只是去散散步,几分钟后回来,你可能会看到它近距离,就像它是最明显的事情摆在首位。

    不管是哪种方式,如果您确定,那么在这种情况下,我建议您检查您的请求是否经过其他具有缓存功能的设备(计算机、路由器、代理等),直到到达预期的目的地。

    通常是路由器,除非你直接连接到 通过服务提供商上网

    有一次我自己的路由器在缓存文件,我知道这很奇怪,但事实就是这样,每当我重新启动它或直接连接到互联网时,我的缓存问题就消失了。不,没有任何其他设备连接到路由器上,只能怪电脑和路由器。

    顺便说一下,一个一般性的建议,虽然它主要适用于那些谁在他们的公司开发计算机,而不是自己的工作。您的开发计算机是否可以运行某种缓存服务?这是可能的。

    Content Delivery Networks (CDN),并取决于CDN提供商, 无论何时更新或更改文件,都需要一段时间 在整个网络中反映的变化。因此它可能是 尚未完成更新。

    无论如何 ,特别是如果您总是一遍又一遍地请求同一个文件,或者如果您找不到问题所在,那么如果可能的话,我建议您重新考虑一次又一次地请求同一个文件的方法,转而考虑构建一个简单的 Web Service

    REST 风格 Web API 为了你自己的需要。

    我希望这个更新在某种程度上对你有用,当然它会为我回来。祝你在编码方面好运。

    12 回复  |  直到 7 年前
        1
  •  13
  •   Community SushiHangover    7 年前

    从上面我猜你在别的地方有问题。你能在服务器端记录http请求吗?当你改变一些随机种子参数时你会得到什么?

    也许服务器缓存文件(如果日志显示请求确实每分钟都被触发)。

    你用ISA还是SQUID?

    我知道用答案回答可能不受欢迎,但评论不允许我这么多的文字:)

    编辑:

    不管怎样,使用 HttpRequest WebClient ,希望(如果你怀疑 网络客户端 )一切都会解决的。如果不解决的话 HttpRequest请求

    进一步完善:

    再低一点: How do I Create an HTTP Request Manually in .Net?

        2
  •  29
  •   Vinay B R    14 年前

    你可以尝试附加一些 作为查询字符串的一部分,将随机数添加到您的url

    对于前-

    Random random = new Random();
    string url = originalUrl + "?random=" + random.Next().ToString();
    webclient.DownloadFile(url, downloadedfileurl);
    
        3
  •  10
  •   Kamran Khan    14 年前

    NoCacheNoStore :

    client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); 
    
        4
  •  7
  •   ivymike    14 年前

    在某些情况下,网络调试软件可能会导致此问题。为了确保您的url没有被缓存,您可以附加一个随机数作为最后一个参数,以使url唯一。在大多数情况下,此随机参数被服务器忽略(服务器尝试读取作为名称-值对发送的参数)。

    http://www.someserver.com/?param1=val1&ThisIsRandom=RandomValue

        5
  •  2
  •   user856684    13 年前

    我在使用webClient的powershell中遇到了类似的问题,在切换到使用webRequest之后也出现了这个问题。我发现socket是重用的,这会导致各种各样的服务器/网络端缓存(在我的例子中,负载均衡器也会妨碍使用https,尤其是https)。解决方法是在webrequest对象中禁用keepalive和可能的管道,如下所示,这将强制每个请求使用一个新的套接字:

    #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() }
    
        6
  •  1
  •   Thakur    14 年前

        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;
        }
    
        7
  •  1
  •   Darin Dimitrov    14 年前
    client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
    

    应该有用。只需确保清除缓存并删除Internet Explorer中所有临时下载的文件 之前 System.Net 和IE使用相同的缓存。

        8
  •  1
  •   Daniel    10 年前

    使用 HTTPRequest "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
  •  1
  •   scott_lotus Tomas Hesse    8 年前

    如果一个网页曾经被访问,现在从服务器上删除,方法HttpWebResponse.GetResponse文件()将为缓存副本提供一个响应,以“在经过足够的时间之前,或者您重新启动计算机,它将不会触发404页未找到错误的预期异常,您现在无法知道该网页现在根本不存在。

    • 将标题设置为(“缓存控制”、“无缓存”)
    • “设置”请求缓存策略到“noCachePolicy”
    • 使用不带路由器的有线互联网。。。。。。。。。。不起作用!

    HttpWebResponse.GetResponse() 会给你一个新的页面来反映变化。

        10
  •  0
  •   superlogical    12 年前

    请检查您是否受到费率限制!我从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.
    
        11
  •  0
  •   Littm JessicaParker    12 年前

    因为我用的是:

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

    我再也没有缓存文件了。

    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
  •  0
  •   efkah    9 年前

    如果您可以访问Web服务器,请打开Internet Explorer转到

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

    清除浏览器缓存,瞧,它会工作的!