spe*_*der 6 c# caching httpwebrequest
如果我设置HttpWebRequest.CachePolicy如下:
var webRequest = (HttpWebRequest) WebRequest.Create(url);
var policy = new HttpRequestCachePolicy( HttpCacheAgeControl.MaxAge,
TimeSpan.FromMinutes(1) );
webRequest.CachePolicy = policy;
Run Code Online (Sandbox Code Playgroud)
并在同一时刻对同一个URL发出两个异步请求,第二个请求会发生什么?第二个是否仅在第一个缓存时完成,或者是否会发出2个请求,因为在发布时没有任何缓存在缓存中?
此外,在这种情况下,什么是缓存?它在哪里生活?我们是否能更好地控制它?
.NET代码中的两个这样的请求将导致两个这样的HTTP请求,只需构建一些这样的命令,运行它,然后测试服务器上发生的事情,就可以很容易地检查这些请求.
这是合适的,因为可能两个请求将收到不同的响应,特别是考虑到其中一个请求可能遭受另一个请求不会发生的错误.还有其他原因(例如,服务器可能会发送每次都不同的响应以及不应缓存的指令).
但是,可能有例外.同时发送到同一域的请求数量有一个默认限制,可以配置,但默认为两个(这是经常抱怨的,因为它在某些用例中是不合适的 - 但每个服务器有两个请求在大多数情况下提供最高的总吞吐量,所以它有充分的理由).
因此,由于此规则,两个请求中的一个很可能会因为排队而延迟.即使默认限制增加,也可能超过该限制.
现在,正如Marc所指出的,一旦响应流被读取到结束*,就可以缓存响应,并且这可能在第二个请求开始时发生,这将导致它使用缓存的响应(如果适用)(响应是可缓存,下载时没有错误).
所以,总的来说,我们希望有两个单独的下载,我们应该很高兴(如果有一个错误),但有可能只有一个下载,因为两个"同时"的请求是被迫实际上不是同时发生的.
*实际上,虽然文档说流必须被读到最后,但它实际上必须被读到最后并关闭,无论是手动,通过处置它(例如从using)或从其执行的终结器.