@evgsvg

Как в C# HttpClient вычислить время отправки запроса, время ожидания ответа и время получения ответа?

Добрый день.
Друзья, возможно ли, используя стандартный C# HttpClient вычислить время отправки запроса, время ожидания ответа и время получения ответа?

Т.е. не общие время выполнения
watch.Start();
var response = await httpClient.SendAsync(httpMessage);
watch.Stop();


Что то вроде этого
watch.Start();
var response = await app.Client.GetAsync("test/GetTestMethod");
watch.Stop();
var requestTime = watch.ElapsedMilliseconds;
watch.Restart();
var content = await response.Content.ReadAsStringAsync();
watch.Stop();
var responseTime = watch.ElapsedMilliseconds;


Надеялся, что если измерить время выполнения response.Content.ReadAsStringAsync(), то получу нужный результат, но как я увидел, это просто чтение уже полученного результата.

Кто нибудь сталкивался с решением этого вопроса?
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ответы на вопрос 2
sarapinit
@sarapinit Куратор тега C#
Точу водой камень
Беглый просмотр кода HttpClient говорит мне, что желаемые значения вы можете получить просто запуская await позже. Но лучше бы кому-то меня перепроверить, потому что код там не самый простой.

watch.Start();
var responseTask = app.Client.GetAsync("test/GetTestMethod");
watch.Stop();
var requestTime = watch.ElapsedMilliseconds;
watch.Restart();
watch.Start();
var response = await responseTask;
watch.Stop();
var fromRequestToStartResponse = watch.ElapsedMilliseconds;
watch.Restart();
watch.Start();
var content = await response.Content.ReadAsStringAsync();
watch.Stop();
var fromStartResponseToEndResponse = watch.ElapsedMilliseconds;
Ответ написан
@evgsvg Автор вопроса
Нужно дополнительно в Get добавить HttpCompletionOption.ResponseHeadersRead
Иначе в строке
response = await responseTask;
будет получен ответ полностью,
а с HttpCompletionOption.ResponseHeadersRead, мы ждём заголовок, а ответ получаем непосредственно в
await response.Content.CopyToAsync(fs);

startSendRequest = DateTime.UtcNow;
var responseTask = HttpClient.GetAsync("Test/GetFile", HttpCompletionOption.ResponseHeadersRead);
endSendRequest = DateTime.UtcNow;

startWaitingResponse = DateTime.UtcNow;
response = await responseTask;
endWaitingResponse = DateTime.UtcNow;

startGetResponse = DateTime.UtcNow;
var fs = new FileStream(@"C:\test\SampleFile.txt", FileMode.Create, FileAccess.Write, FileShare.None);
await response.Content.CopyToAsync(fs);
endGetResponse = DateTime.UtcNow;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы