确定特定HttpClient请求是否使用了缓存的方法

4
新的.NET 4.5 HttpClient类非常方便发送网络请求,因此我正试图使用它代替旧的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个回答

1

年龄标头 显示它来自缓存。左侧是第一个(未缓存)请求,右侧是第二个(已缓存)请求:

enter image description here


-1

我认为你可以检查一下状态码。如果是304则说明来自缓存,但如果是200则是最新的副本。

你可以在这里看到所有的枚举(和数字)。


我已经对这些方面进行了一些调查...实际上,当它来自缓存(甚至没有与服务器联系)时,我确实会收到200状态码...头部中有一些与缓存相关的内容,我可以尝试解析出来,但不确定可靠性如何。 - TCC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接