29

我正在针对专有库进行开发,并且遇到了HttpWebRequest. 该库使用与以下代码等效的代码来发出请求:

var request = WebRequest.Create("http://example.com/") as HttpWebRequest;

request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable);

尽管每个响应不同,但外部资源不允许缓存。因此,我每次都会得到相同的响应。

有什么办法可以清除HttpWebRequest缓存的内容吗?正确的解决方案是修复外部源或更改缓存策略,但两者都不可能 - 因此是问题所在。

清除缓存可能会产生各种影响,因此最好的解决方案是基于每个资源使缓存无效。

4

5 回答 5

15
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。

于 2009-03-12T03:22:13.383 回答
13

HttpWebRequest用于System.Net.Cache.RequestCache缓存。这是一个抽象类;Microsoft.Win32.WinInetCache顾名思义,Microsoft CLR 中的实际实现是使用WinInet函数进行缓存。

这与 Internet Explorer 使用的缓存相同,因此您可以使用 IE 的“删除浏览历史记录”对话框手动清除缓存。(首先执行此操作作为测试,以确保清除 WinInet 缓存可以解决您的问题。)

假设清除 WinInet 缓存可以解决问题,您可以通过 P/Invoking 到DeleteUrlCacheEntry WinInet API 以编程方式删除文件:

public static class NativeMethods
{
    [DllImport("WinInet.dll", PreserveSig = true, SetLastError = true)]
    public static extern void DeleteUrlCacheEntry(string url);
}
于 2012-06-16T05:41:24.690 回答
1

我没有尝试过,但一种解决方案可能是将任意查询字符串添加到被请求的 url。

这个查询字符串每次都会改变,可能使用 DateTime.Now 意味着每次的 url 都会不同。然后每个请求都会被重新请求。

于 2012-04-01T20:55:02.687 回答
0

您可以更改缓存策略:使用 http 反向代理,并删除/更改相关的 http 标头。这是一个黑客,但它会工作,而且很容易。我建议您使用 Apache httpd 服务器来完成此任务(使用 mod_proxy)。

于 2009-08-14T19:22:07.857 回答
-1

添加以下行以在 Webclient 获取数据时清除缓存:

Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")
于 2017-12-07T08:03:01.500 回答