【发布时间】:2011-04-18 05:54:22
【问题描述】:
美好的一天。
我在我的 C# 应用程序中使用 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。没有效果,但是如果我重新启动计算机,缓存似乎已被清除,但我不能每次都重新启动计算机。
针对最近的活动进行更新(2012 年第 8 套)
标记为已接受的answer 解决了我的问题。简单来说,我用 用于下载文件的套接字,这解决了我的问题。基本上是一个 GET 请求所需的文件,我不会详细说明如何做, 因为我相信你可以在 SO in 上找到很多“如何做” 为了自己做同样的事情。虽然这并不意味着我的解决方案也是最适合您的,但我的第一个建议是阅读其他答案,看看是否有用。
无论如何,由于这个问题最近出现了一些活动,我考虑添加此更新以包含一些提示或想法,我认为这些提示或想法应该被那些尝试过的面临类似问题的人考虑 他们能想到的一切,并确定问题不在于 用他们的代码。 可能是大多数情况下的代码,但有时我们只是看不到它,只是去散散步,几分钟后回来,你可能会看到它是最空白的范围首先是显而易见的事情。
无论哪种方式,如果您确定,那么在这种情况下,我建议您检查天气,您的请求会通过其他具有缓存功能的设备(计算机、路由器、代理...),直到它到达预期的目的地。
考虑到大多数请求都通过前面提到的一些此类设备,更多 通常是路由器,当然除非你直接连接到 通过您的服务提供商上网 网络。
有一次我自己的路由器正在缓存文件,我知道很奇怪,但确实如此,每当我重新启动它或直接连接到 Internet 时,我的缓存问题就消失了。而且没有任何其他设备连接到路由器可以受到指责,只有计算机和路由器。
顺便说一下,一个一般性的建议,虽然它主要适用于那些在公司开发计算机而不是自己的计算机上工作的人。可以通过任何更改您的开发计算机运行各种缓存服务吗?这是可能的。
此外,考虑到许多高端网站或服务使用Content Delivery Networks (CDN),并且取决于 CDN 提供商, 每当更新或更改文件时,都需要一些时间 变化反映在整个网络中。因此它可能是 可能你运气不好,要求一个文件可能是 更新中,离你最近的 CDN 服务器 还没更新完。
无论如何,特别是如果您总是一遍又一遍地请求同一个文件,或者如果您找不到问题所在,那么如果可能的话,我建议您重新考虑您的方法一次又一次地请求相同的文件,而是考虑构建一个简单的Web Service,以满足您首先考虑满足此类文件的需求。
如果您正在考虑这样的选择,我认为您可能会更轻松地根据自己的需要构建REST 样式Web API。
我希望此更新在某种程度上对您有用,肯定会在回来时对我有用。祝您的编码工作好运。
【问题讨论】:
-
您能否举例说明使用无缓存时的请求和响应标头?从你到目前为止所说的来看,它似乎确实应该起作用。
-
您是否对每个请求使用相同的 WebClient 实例?如果您将其丢弃并每次都创建一个新的会发生什么?
-
@rossisdead:完全一样。