Dot Net HttpClient 是否意外缓存响应?

Lar*_*tig 5 .net c# wininet http-caching

我正在尝试编写一个类似curl 的工具,它演示了各种HTTP 缓存标头对dot net 的HttpClient 类的影响。

在我最初的尝试中,我将该工具指向我的一个内部 Web 服务,该服务未在响应中指定任何缓存信息并检查响应的标头。

我希望看到请求每次都重新发送并在服务器上执行,每次返回一组新的但相同的内容(出于本测试的目的,内容在服务器上是静态的)。但是,相反,第一个请求之后的每个请求的返回速度都比第一个请求快得多,并且包含第一个响应中不存在的新标头 Age。这表明我的命令行工具中的 HttpClient 正在从缓存返回响应,而不是发出新请求。

这是带有响应标头的第一个请求:

HTTP:>GET http://myserver:8058/path1/path2
Status 200 OK (OK in 00:00:00.3235905):
Date = Sat, 08 Jul 2017 15:55:22 GMT
Server = Microsoft-HTTPAPI/2.0
Content-Length = 150867
Content-Type = application/json; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

这是我的curl工具的同一会话稍后发出的请求:

HTTP:>GET http://myserver:8058/path1/path2
Status 200 OK (OK in 00:00:00.0188433):
Date = Sat, 08 Jul 2017 15:55:22 GMT
Server = Microsoft-HTTPAPI/2.0
Age = 312
Content-Length = 150867
Content-Type = application/json; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

最后,在我停止并启动程序后,这是来自新实例的另一个请求:

HTTP:>GET http://myserver:8058/path1/path2
Status 200 OK (OK in 00:00:00.0517271):
Date = Sat, 08 Jul 2017 15:55:22 GMT
Server = Microsoft-HTTPAPI/2.0
Age = 528
Content-Length = 150867
Content-Type = application/json; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

我发现最后一个更难以理解,因为我的印象是(通过阅读此内容: https: //aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/)缓存是根据HttpClient 的每个实例维护的。

随着年龄增加每个请求,这种情况似乎会永远持续下去。恢复原始响应的唯一方法是使用 Internet Explorer 并删除临时 Internet 文件。

[其他信息]在让我的命令行应用程序打开几个小时后,我重复了请求并收到了与原始请求相同的响应,但没有 Age 标头。因此,如果 HttpClient 缓存响应,那么该缓存将在几个小时后过期。

谁能告诉我 HttpClient 在这种情况下执行内部缓存是否正确,如果是,为什么在没有任何与缓存相关的响应标头的情况下这样做,以及它使用什么策略?