我正在开发一个专有的库,我遇到了缓存的一些问题HttpWebRequest
.该库使用与下面相同的代码来发出请求:
var request = WebRequest.Create("http://example.com/") as HttpWebRequest; request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable);
尽管每个响应都不同,但外部资源不会禁止缓存.因此,我每次都得到相同的回应.
有没有办法清除HttpWebRequest
缓存的内容?正确的解决方案是修复外部源或者更改缓存策略,但两者都不可能 - 因此问题.
清除高速缓存可能具有各种影响,因此优选地,解决方案是基于每个资源使高速缓存无效.
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.
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); }