奇怪的 HttpClient 在 GetAsync 完成之前很久就记录了结束请求

Strange HttpClient logging of end request long before GetAsync is finished

我向 REST API 发出一些 HTTP 请求 returns 相当多的数据(大约 100 MB)。我现在已经使用 .Net Core 中的 HttpClientFactory 来获取数据并且工作正常。但是令我困惑的是我的时间和来自图书馆本身的内部时间之间的差异。

这是来自图书馆的示例消息:

End processing HTTP request after 130311.0094ms - OK

问题是:即使库已经写入所有数据(执行 client.GetAsync() 方法),真正下载所有数据实际上还需要 20-30 秒。

我假设这里发生的事情是图书馆非常渴望在收到 header 后立即报告,而不是等待 body 下载。

这听起来确实像是一个错误,但我不确定是不是。也许有人对发生这种情况的原因有更好的解释?

P.S。这是我的代码示例:

Stopwatch watch = new Stopwatch();
watch.Start();
var response = await Client.GetAsync(url);
watch.Stop();
Console.WriteLine($"Elapsed time {watch.ElapsedMilliseconds} ms");

我日志中的运行时间比系统消息中的运行时间长很多

P.P.S我试过了运行HttpCompletionOption.ResponseContentRead但是真的没有改变结果,还是相差很大

似乎这就是 HttpClient 中日志框架使用的中间件的工作方式。由于某种原因,body 的加载发生在管道之外,因此日志记录总是在收到 headers 之后立即发生。

github 上的 question 中有更多详细信息。