C#WebClient禁用缓存早安。我在我的C#应用程序中使用WebClient类,这样每分钟都会下载相同的文件,然后应用程序会进行简单检查以查看文件是否已更改,以及它是否会对其执行操作。好吧,由于这个文件每分钟下载一次,WebClient缓存系统缓存了这个文件,而不是再次下载这个文件,它只是从缓存中获取文件,从而检查下载的文件是否是一个新文件。所以我想知道如何禁用WebClient类的缓存系统。我试过。Client.CachePolicy=newSystem.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);我也试过标题。WebClient.Headers.Add("缓存控制","无缓存");没用。那么如何禁用缓存呢?谢谢。编辑我还尝试了以下CacheLevels:NoCacheNoStore、BypassCache、Reload。没有效果,但是如果我重启电脑,缓存好像被清空了,但是每次都重启不了。面对最近的活动更新(2012年第8集),标记为已接受的答案解决了我的问题。简单来说,我使用套接字下载文件,这解决了我的问题。基本上是对所需文件的GET请求,我不会详细介绍如何执行此操作,因为我相信您可以在SO上找到很多“操作方法”来自己做同样的事情。虽然这并不意味着我的解决方案也最适合您,但我的第一个建议是阅读其他答案,看看它是否有效。无论如何,由于这个问题最近出现了一些活动,我想添加此更新以包含一些我认为应该被面临类似问题的人考虑的提示或想法,他们已经尝试了他们能想到的一切,并确保问题没有在他们的代码上撒谎。大多数时候可能是代码,但有时我们只是不看太多,只是走了几分钟然后回来,你可能会看到它是空白区域,就像它是最明显的一样。第一。无论哪种方式,如果您确定,那么在那种情况下,我建议检查您的请求是否会通过具有缓存功能的其他设备(计算机、路由器、代理……),直到它到达预期的目的地。考虑到大多数请求都会通过前面提到的其中一些设备,除非您通过服务提供商网络直接连接到Internet,否则路由器更为常见。有一段时间我自己的路由器在缓存文件,我知道这很奇怪,但就是这样,每当我重新启动它或直接连接到互联网时,我的缓存问题就消失了。并且不能怪其他连接到路由器的设备,只能怪计算机和路由器。顺便说一句,一般建议,虽然它主要适用于那些在公司开发计算机上工作的人,而不是他们自己的。是否可以对您的开发计算机进行任何更改以运行各种缓存服务?可能的。此外,考虑到许多高端网站或服务使用内容交付网络(CDN),并且根据CDN提供商的不同,无论何时更新或更改文件,此类更改都需要一些时间才能在整个网络上反映出来。因此,有可能您请求的文件可能正在更新中,而最近的CDN服务器尚未完成更新。无论如何,特别是如果你总是一遍又一遍地请求同一个文件,或者你找不到问题,那么如果可能的话,我建议你重新考虑你的方法并一次又一次地请求同一个文件,而不是考虑构建一个简单的网络服务,以满足您首先满足此类文件的需求。如果您正在考虑这样的选择,我认为您可以更轻松地构建满足您需求的REST样式WebAPI。我希望此更新在某种程度上对您有用,并且在我回来时肯定会有用。祝您编码工作顺利。从上面我猜你在其他地方有问题。你能在服务器端记录http请求吗?当你改变一些随机种子参数时你会得到什么?也许服务器缓存了文件(如果日志显示请求确实每分钟都在触发。您使用的是ISA还是SQUID?您的请求的http响应代码是什么?我知道回答答案可能不受欢迎,但评论不会不允许我写这么多文字:)编辑:无论如何,使用HttpRequest对象而不是WebClient,并希望(如果您对WebClient有疑问)一切都会得到解决。如果用HttpRequest没有解决,那么问题确实在别处。进一步细化:Lower:HowtomanuallycreateHTTPrequestsin.Net?这是纯套接字,如果问题仍然存在,请打开一个新问题并将其标记为WTF?每次下载文件时,您都可以尝试将一些随机数附加到您的网址,作为查询字符串的一部分。这确保每次都有唯一的URL。对于exRandomrandom=newRandom();字符串url=originalUrl+"?random="+random.Next().ToString();webclient.DownloadFile(url,downloadedfileurl);tryNoCacheNoStore:从不通过使用缓存中的资源来满足请求,也不会缓存资源。如果资源存在于本地缓存中,它将被删除。此策略级别向中间缓存指示应删除资源。在HTTP缓存协议中,这是使用no-cache缓存控制指令实现的。client.CachePolicy=newSystem.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);在某些情况下,网络调试软件可能会导致此问题。为确保您的url未被缓存,您可以附加一个随机数作为最后一个参数以使url唯一。在大多数情况下,服务器会忽略此随机参数(它会尝试读取作为名称-值对发送的参数)。示例:http://www.someserver.com/?param1=val1&TheThisIsRandom=RandomValue其中ThisIsRandom=RandomValue是添加的新参数。我猜你将不得不不使用webrequest/webresponse而不是webclientWebRequestrequest=WebRequest.Create(uri);//只为这个请求定义一个缓存策略。HttpRequestCachePolicynoCachePolicy=newHttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);request.CachePolicy=noCachePolicy;WebResponse响应=request.GetResponse();//下面是下载文件的函数publicstaticintDownloadFile(StringremoteFilename,StringlocalFilename){//函数将返回处理的字节数//给调用者。这里初始化为0。intbytesProcessed=0;//在这里为这些对象赋值,以便它们可以//在finally块中被引用StreamremoteStream=null;流localStream=null;WebResponse响应=空;//使用try/catch/finally块作为WebRequest和Stream//类在错误时抛出异常try{//为指定的远程文件名创建请求WebRequestrequest=WebRequest.Create(远程文件名);//只为这个请求定义一个缓存策略。HttpRequestCachePolicynoCachePolicy=newHttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);request.CachePolicy=noCachePolicy;if(request!=null){//将请求发送到服务器并检索//WebResponse对象response=request.GetResponse();if(response!=null){if(response.IsFromCache)//做你想做的事//检索到WebResponse对象后,//获取与响应数据关联的流对象remoteStream=response.GetResponseStream();//创建本地文件localStream=File.Create(localFilename);//分配一个1k的缓冲区byte[]buffer=newbyte[1024];intbytesRead;//简单的do/while循环从流中读取数据,直到//没有返回任何字节do{//从流中读取数据(最大1k)bytesRead=remoteStream.Read(buffer,0,buffer.Length);//将数据写入本地文件localStream.Write(buffer,0,bytesRead);//在增加处理的总字节数bytesProcessed+=bytesRead;}while(bytesRead>0);}}}catch(Exceptione){Console.WriteLine(e.Message);}finally{//在这里关闭响应和流对象//以确保它们被关闭,即使在某个时刻抛出异常//if(response!=null)response.Close();if(remoteStream!=null)remoteStream.Close();if(localStream!=null)localStream.Close();}//返回处理的总字节数给调用者。返回字节处理;}client.CachePolicy=newRequestCachePolicy(RequestCacheLevel.BypassCache);应该工作只要确保清除缓存并删除文件的任何临时下载,因为System.Net和IE使用相同的缓存。在切换到使用webRequest之后,使用webClient的powershell也遇到了类似的问题。我发现套接字被重用并导致各种服务器/网络端缓存(在我的例子中,负载平衡器对https尤其有问题)。解决方案是禁用webrequest对象中的keepalive和可能的管道,如下所示,这会强制为每个请求添加一个新套接字:#DefineFuncsFunctionhttpRequest{param([string]$myurl)$r=[System.Net.WebRequest]::Create($myurl)$r.keepalive=0$sr=new-objectSystem.IO.StreamReader(($r.GetResponse()).GetResponseStream())$sr。ReadToEnd()}使用HTTPRequest绝对是您问题的正确答案。但是,如果您希望让您的WebBrowser/WebClient对象不使用缓存页面,您不仅应该包括“无缓存”,还应该包括所有这些标头:在IE11中,直到我包括最后两个中的一个或两个,它只适用于我。这里的方法似乎都不能解决问题:如果网页曾经可以访问但现在已从服务器中删除,则HttpWebResponse.GetResponse()方法将为您提供对缓存副本的响应,该副本以“sufficientperiodoftime”时间过去了,或者您重新启动了计算机,它并没有触发预期的404页面未找到错误异常,您现在不知道该网页现在根本不存在。我尝试了所有方法:幸运的是,如果网页更改了其内容,HttpWebResponse.GetResponse()将为您提供一个新页面以反映更改。检查您的价格是否有限!我从nginx服务器返回:403ForbiddenLimitexceeded,请24小时后再试。这是我正在使用的程序(C#)usingSystem;使用System.IO;使用System.Net;命名空间ConsoleApplication1{类程序{staticvoidMain(string[]args){DownloadFile();控制台.ReadLine();}publicstaticvoidDownloadFile(){vardownloadedDatabaseFile=Path.Combine(Path.GetTempPath(),Path.GetTempFileName());Console.WriteLine(downloadedDatabaseFile);varclient=newWebClient();client.DownloadProgressChanged+=(sender,args)=>{Console.WriteLine("{0}of{1}{2}%",args.BytesReceived,args.TotalBytesToReceive,args.ProgressPercentage);};client.DownloadFileCompleted+=(sender,args)=>{Console.WriteLine("下载文件完成");如果(args.Error!=null){Console.WriteLine(args.Error.Message);}};client.DownloadFileAsync(newUri("http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dats.gz"),downloadedDatabaseFile);}}}控制台打印出来:C:Usersjake.scott.WIN-J8OUFV09HQ8AppDataLocalTemp2tmp7CA.tmp下载文件完成远程服务器返回错误:(403)禁止访问。因为我使用以下内容:wclient.CachePolicy=newSystem.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);wclient.Headers.Add("缓存控制","无缓存");我没有缓存文件了我还添加了这个我发现在每次调用之前删除IE临时文件的函数:privatevoiddel_IE_files(){//用于删除文件System.IO.DirectoryInfoDInfo=newDirectoryInfo(path);FileAttributesAttr=DInfo.Attributes;DInfo.Attributes=FileAttributes.Normal;foreach(DInfo.GetFiles()中的FileInfo文件){file.Delete();}foreach(DirectoryInfodirinDInfo.GetDirectories()){try{dir.Delete(true);//deletesubdirectoriesandfiles}catch{}}}如果您有权访问Web服务器,请打开InternetExplorerInternetExplorer->Internet选项->浏览历史“设置”->Internet临时文件“从不”清除浏览器缓存并瞧,它有效!以上就是C#学习教程的全部内容:C#WebClient禁用缓存共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
