【问题标题】:How to clear the cache of HttpWebRequest如何清除HttpWebRequest的缓存
【发布时间】:2009-02-10 13:00:24
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 这个问题的答案是什么? Bradley 的回答是我认为正确的,但根据经验,我发现清除 IE 缓存(并使用 Fiddler)不起作用。
  • 我知道这是前段时间有人问过的,我认为这个问题Clearing Page Cache in ASP.Net 可能也会有所帮助。

标签: .net caching httpwebrequest


【解决方案1】:
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。

【讨论】:

  • 如前所述,无法更改缓存策略。我想要一个真正清除缓存存储的解决方案——而不是完全避免缓存。
  • 我相信 Cyber​​Ming 是正确的。 NoCacheNoStore 实际上会清除所请求 url 的缓存存储,并且可能实际上是您要查找的内容? >(来自文档) HttpRequestCacheLevel.NoCacheNoStore ... 从不使用缓存中的资源满足请求并且不缓存资源。 如果资源存在于本地缓存中,则将其删除...
  • 我正在搜索如何知道响应来自哪里(是否来自缓存,因为状态总是 200,好像没有使用缓存一样),你给我响应:IsFromcache。谢谢。
  • 为什么要添加前两行(使用`HttpWebRequest.DefaultCachePolicy = policy;`)?即使没有它们,它也不会一样工作吗?
  • @MuiBienCarlota response.IsFromCache
【解决方案2】:

HttpWebRequest 使用 System.Net.Cache.RequestCache 进行缓存。这是一个抽象类; Microsoft CLR 中的实际实现是Microsoft.Win32.WinInetCache,顾名思义,它使用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);
}

【讨论】:

  • 你说得对,涉及到 Microsoft.Win32.WinInetCache 并从 Microsoft.Win32.WinInetCache.ReadStream 读取响应,但这并不意味着它与 IE 的缓存位置相同。
  • @MuiBienCarlota:在实践中,我发现确实如此。据我所知,Internet Explorer 仍然使用 WinInet 缓存功能;如果它和 .NET 都在同一个用户帐户下运行,则 CreateUrlCacheEntry 和 DeleteUrlCacheEntry 创建/删除的文件应该在同一个位置。
  • 有用的答案,但是您知道 HttpWebRequest 在 Linux(.NET Core / .Net Standard)上运行时是否缓存响应,如果有,在哪里?
  • @Joe 这完全不同,你应该问一个新问题。
  • @BradleyGrainger - 是的,在我做了一些研究之后,我可能会这样做,谢谢。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      添加以下行以在 Web 客户端获取数据时清除缓存:

      Webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache")
      

      【讨论】:

        猜你喜欢
        • 2012-11-12
        • 2011-05-10
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 2017-02-11
        • 2020-03-13
        相关资源
        最近更新 更多