WebRequest不会在同一进程中提供缓存项

Dav*_*bbo 4 c# webrequest httpwebrequest

我们看到一种奇怪的行为,即在创建新进程之前,缓存中无法使用WebRequest API缓存(在IE/wininet缓存中)缓存的内容.

请考虑以下代码:

using System;
using System.IO;
using System.Net;
using System.Net.Cache;
using System.Threading;

namespace HttpCachingTest {
    class Program {
        static void Main(string[] args) {
            MakeRequest();
            Thread.Sleep(1000);
            MakeRequest();
        }

        private static void MakeRequest() {
            var request = (HttpWebRequest)WebRequest.Create("http://a0.twimg.com/a/1286210883/images/twitter_logo_header.png");
            request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);

            var response = (HttpWebResponse)request.GetResponse();
            Console.WriteLine(String.Format("IsFromCache: {0}, ContentLength: {1}", response.IsFromCache, response.ContentLength));

            using (var fileStream = File.OpenWrite("test.jpg")) {
                response.GetResponseStream().CopyTo(fileStream);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们看到的行为是,对于第二个请求,IsFromCache为false.但是,如果我们第二次运行应用程序,则IsFromCache为true.这意味着事物被正确缓存,但那些刚刚缓存的东西对当前进程不可用,这没什么意义.

任何人都可以解释这种行为,并知道如何修复它,以便缓存的项目可以立即被击中?

Jon*_*nna 5

你没有丢弃HttpWebResponse和返回的流GetResponseStream().因此它似乎没有完成处理所述请求,并且它得到的数据不能被安全地存储在高速缓存中,因为它可能不是一个完整的实体.当你的过程结束后,将finalisers解决这个问题,所以它会在缓存在下次运行时间.

正确配置您的一次性对象,缓存行为将符合预期.