【问题标题】:Method to determine if caching was used for a particular HttpClient request确定缓存是否用于特定 HttpClient 请求的方法
【发布时间】:2013-04-25 22:52:01
【问题描述】:

新的 .NET 4.5 HttpClient 类可以方便地发送 Web 请求,因此我尝试使用它来代替旧的 HttpWebRequest 和相关类。

我可以让它做我以前做的几乎所有事情,包括解压缩、缓存......

但是我怎么知道缓存是否满足了一个已完成的请求呢?

这在以前是可能的:

using (var resp = request.GetResponse())
using (var rs = resp.GetResponseStream())
{
    if (!resp.IsFromCache)
    {
        //do something
    }
}

我可以在哪里添加支票?

HttpClient client = new HttpClient(
            new WebRequestHandler
            {
                AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
                CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.CacheIfAvailable),
                UseDefaultCredentials = true,
                PreAuthenticate = true
            });
var data = await client.GetByteArrayAsync(uri);
//did that come from the cache?
return data;

预期“为什么需要知道它是否来自缓存?” ...好吧,我碰巧想知道我是否只是与服务器通信,因为如果我这样做了,那么我将扩展会话保持活动计时器...但是如果我只是从缓存中获取它并且甚至没有转到服务器,我可能需要尽快发送会话保持活动请求...为此服务器创建会话至少需要几秒钟,我想避免它。

如果我在 HttpClient 上使用更多零碎的方法,则有更多空间来调查响应并查找状态代码和标头:

var resp = await client.GetAsync(uri);
resp.EnsureSuccessStatusCode();
//can look at status codes, headers etc here
return await resp.Content.ReadAsByteArrayAsync();

无论是否缓存,状态码似乎都是 200 ... 标头中有一些有趣的东西,但我不知道如何解释所有这些。

例如resp.Headers.Date 看起来它的日期响应被缓存了,所以如果它在过去足够远(超过几秒钟?)可能会告诉我它是否被缓存。但我就是不知道这种想法有多靠谱……

【问题讨论】:

    标签: c# caching httpclient


    【解决方案1】:

    Age header 表明它来自缓存。左边是第一个(未缓存的)请求,右边是第二个(缓存的)请求:

    【讨论】:

      【解决方案2】:

      我想也许你可以查看StatusCode。如果它是 304 来自缓存,但如果它是 200 它是一个新副本。

      您可以看到所有枚举(和数字)here

      【讨论】:

      • 我已经沿着这些思路做了一些挖掘......事实上,当它来自缓存时(甚至不与服务器联系),我确实得到了一个 200 状态代码......标头中有一些与缓存相关的内容,我可以尝试解析出来,但不确定它的可靠性。
      猜你喜欢
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多