我正在针对专有库进行开发,我遇到了HttpWebRequest
缓存的一些问题。该库使用与下面相同的代码来发出请求:
var request = WebRequest.Create("http://example.com/") as HttpWebRequest;
request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable);
尽管每个响应都不同,但外部资源不会禁止缓存。因此,我每次都得到相同的答案。
有没有办法清除HttpWebRequest
缓存的内容?正确的解决方案是修复外部源或者更改缓存策略,但两者都不可能 - 因此问题。
清除缓存可能会产生各种影响,因此最好解决方案是在每个资源的基础上使缓存无效。
答案 0 :(得分:14)
public static WebResponse GetResponseNoCache(Uri uri)
{
// Set a default policy level for the "http:" and "https" schemes.
HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);
HttpWebRequest.DefaultCachePolicy = policy;
// Create the request.
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();
Console.WriteLine("IsFromCache? {0}", response.IsFromCache);
return response;
}
您可以将缓存策略设置为对NoCacheNoStore的请求到HttpWebRequest。
答案 1 :(得分:10)
HttpWebRequest
使用System.Net.Cache.RequestCache
进行缓存。这是一个抽象的类; Microsoft CLR中的实际实现是Microsoft.Win32.WinInetCache
,顾名思义,它使用WinInet函数进行缓存。
这与Internet Explorer使用的缓存相同,因此您可以使用IE的“删除浏览历史记录”对话框手动清除缓存。 (首先将其作为测试,以确保清除WinInet缓存可以解决您的问题。)
假设清除WinInet缓存可以解决问题,您可以通过P /调用DeleteUrlCacheEntry WinInet API以编程方式删除文件:
public static class NativeMethods
{
[DllImport("WinInet.dll", PreserveSig = true, SetLastError = true)]
public static extern void DeleteUrlCacheEntry(string url);
}
答案 2 :(得分:1)
我还没有尝试,但解决方案可能是将任意查询字符串添加到所请求的网址。
这个查询字符串每次都会改变,也许使用DateTime.Now意味着每次都会有不同的url。然后,每个请求都会被重新请求。
答案 3 :(得分:0)
您可以更改缓存策略:使用http反向代理,并删除/更改相关的http标头。这是一个黑客,但它会工作,而且很容易。我建议您使用Apache httpd服务器执行此任务(使用mod_proxy)。
答案 4 :(得分:-1)
添加以下行以在Webclient获取数据时清除缓存:
Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")