确定缓存是否针对特定HttpClient请求的方法

时间:2013-04-25 22:52:02

标签: c# caching httpclient

新的.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看起来它的日期响应被缓存了,所以如果它过去的距离足够远(超过几秒钟?),它可能告诉我它是否被缓存。但我只是不知道这种想法有多可靠......

2 个答案:

答案 0 :(得分:0)

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

enter image description here

答案 1 :(得分:-1)

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

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