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