Странная регистрация HttpClient конечного запроса задолго до завершения GetAsync

Я делаю несколько HTTP-запросов к REST API, которые возвращают довольно много данных (около 100 МБ). Теперь я использовал HttpClientFactory из .Net Core для получения данных, и он отлично работает. Но что меня озадачило, так это несоответствие между моим временем и внутренним временем, которое исходит от самой библиотеки.

Вот пример сообщения из библиотеки:

Завершить обработку HTTP-запроса через 130311,0094 мс — ОК

Дело в том, что действительно требуется еще 20-30 секунд, чтобы действительно загрузить все данные, хотя библиотека написала, что все готово (для выполнения метода client.GetAsync()).

Я предполагаю, что здесь происходит то, что библиотека очень хочет сообщить сразу после получения заголовка, не дожидаясь загрузки тела.

Это действительно звучит как ошибка, но я не уверен, так ли это. Может быть, у кого-то есть лучшее объяснение, почему это происходит?

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, но это действительно не изменило результат, разница все равно большая.


person Ilya Chernomordik    schedule 15.02.2019    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person Daniel A. White    schedule 15.02.2019
comment
Это чисто теоретический вопрос, поэтому пример здесь не нужен, так как я не спрашиваю, как улучшить код или найти ошибку в моем коде.   -  person Ilya Chernomordik    schedule 15.02.2019
comment
переполнение стека не подходит для теоретических вопросов.   -  person Daniel A. White    schedule 15.02.2019
comment
Это совершенно правильный вопрос о том, как работает библиотека, хотя кода для предоставления нет, я действительно не понимаю такого отношения к тому, почему этот вопрос должен быть закрыт.   -  person Ilya Chernomordik    schedule 15.02.2019
comment
возможно, происходит обмен. трудно сказать без того, как вы пишете свой код.   -  person Daniel A. White    schedule 15.02.2019
comment
@DanielA.White Я добавил пример, думал, что это действительно немного, и я сомневаюсь, что это может помочь ...   -  person Ilya Chernomordik    schedule 15.02.2019
comment
насколько велик ответ?   -  person Daniel A. White    schedule 15.02.2019
comment
Это около 100 МБ, я добавил это к вопросу   -  person Ilya Chernomordik    schedule 15.02.2019
comment
Возможный дубликат stackoverflow.com/a/15375507/507793, найдите client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);   -  person Matthew    schedule 15.02.2019
comment
Не совсем дубликат, но спасибо за полезную ссылку! Вероятно, это действительно ответ: HttpCompletionOption заставляет его вести себя таким образом.   -  person Ilya Chernomordik    schedule 15.02.2019
comment
Проверьте сетевой трафик с помощью Fiddler или с помощью F12 в Chrome/Firefox.   -  person Roland    schedule 15.02.2019


Ответы (1)


Кажется, именно так работает промежуточное ПО в HttpClient, которое используется фреймворком ведения журнала. Загрузка тела происходит по какой-то причине вне конвейера, поэтому логирование всегда происходит сразу после получения заголовков.

Дополнительные сведения см. в этом вопросе на github.

person Ilya Chernomordik    schedule 19.02.2019