HttpWebRequest.CachePolicy:有关缓存的问题

时间:2010-11-20 02:44:51

标签: c# caching httpwebrequest

如果我按如下方式设置HttpWebRequest.CachePolicy

var webRequest = (HttpWebRequest) WebRequest.Create(url);
var policy = new HttpRequestCachePolicy( HttpCacheAgeControl.MaxAge,
                                         TimeSpan.FromMinutes(1) );
webRequest.CachePolicy = policy;

并在同一时刻对同一个URL发出两个异步请求,第二个请求会发生什么?第二个是否仅在第一个缓存时完成,或者是否会发出2个请求,因为在发布时没有任何内容在缓存中?

另外,在这种情况下,什么是缓存?它在哪里生活?我们是否能更好地控制它?

2 个答案:

答案 0 :(得分:5)

.NET代码中的两个这样的请求将导致两个这样的HTTP请求,只需构建一些这样的命令,运行它,然后测试服务器上发生的事情,就可以很容易地检查它。

这是合适的,因为这两个请求可能会收到不同的响应,特别是考虑到其中一个请求可能会遇到另一个没有的错误。还有其他原因(例如,服务器可能会发送每次都不同的响应以及不应缓存的指令。)

然而,可能有例外。同时发送到同一域的请求数量有一个默认限制,可以配置,但默认为两个(这是经常抱怨的,因为它在某些用例中是不合适的 - 但是每个服务器有两个请求在大多数情况下提供最高的总吞吐量,所以这是有充分理由的。)

因此,由于此规则,两个请求中的一个很可能会因为排队而被延迟。即使默认限制增加,也可能超过该限制。

现在,正如Marc所说,一旦响应流被读取到结束*,就可以缓存响应,并且这可能在第二个请求开始时发生,这将导致它使用缓存的响应(如果适用)响应是可缓存的,下载时没有错误。)

所以,总的来说,我们希望有两个单独的下载,我们应该很高兴(如果一个有错误),但有可能只有一个下载,因为两个“同时“请求被迫实际上不是同时发生的。

*实际上,虽然文档说必须将流读取到最后,但实际上必须通过处理它(例如来自{{}来手动地将其读取到结束。 1}})或正在执行的终结者。

答案 1 :(得分:2)

首先,HttpWebRequestdocumented,因为它一次只能执行一个异步请求(提升InvalidOperationException),因此您需要两个此类请求。如果你同时提出了两个这样的请求我完全希望两者都去服务器 - 没有理由不这样做。 In particular

  

如果检索到资源的响应流并将其读取到流的末尾,则仅将资源的副本添加到缓存中。因此,对同一资源的另一个请求可以使用缓存副本,具体取决于此请求的缓存策略级别。

因此,在提出请求时,我们应该(从问题中)假设数据尚未被读取 - 因此尚未在本地缓存任何内容。

根据两个请求是否都路由到同一服务器,服务器可能对请求进行排队,可能配置为缓存结果,但很可能是服务器只会在这里处理两次。