代码之家  ›  专栏  ›  技术社区  ›  David Ebbo

WebRequest不会使缓存项在同一进程中可用

  •  4
  • David Ebbo  · 技术社区  · 14 年前

    我们看到了一个奇怪的行为,即由于使用webrequestapi而缓存的东西(在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);
                }
            }
        }
    }
    

    我们看到的行为是,对于第二个请求,IsFromCache为false。但是,如果我们再次运行应用程序,那么IsFromCache是真的。这意味着缓存的内容是正确的,但是那些刚刚缓存的内容对当前进程不可用,这没有什么意义。

    有人能解释一下这种行为吗,并知道如何修复它,以便缓存项可以立即被命中?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Jon Hanna    14 年前

    你不是在处理 HttpWebResponse 也没有那条小溪 GetResponseStream() . 因此,它似乎没有完成对请求的处理,并且它获得的数据不能安全地存储在缓存中,因为它可能不是完整的实体。当您的进程结束时,最终确定者将修复此问题,以便下次运行时它将在缓存中。

    正确处理一次性对象,缓存行为将如预期的那样。