Как получить истекшее время Получение запроса REST GET в async / await с httpclient в ядре .net - PullRequest
0 голосов
/ 01 декабря 2018

Когда я вызываю метод DoRestCall ниже с помощью Task.Wait, истекшее время показывает в основном 0 (ОК, это показывает 3 мс).Я понял, что это из-за шаблона асинхронности / ожидания.Я хочу узнать точное время, которое потребовалось для завершения остального вызова.Я не могу найти способ проникнуть внутрь HttpClient, чтобы понять это.

public static async Task DoRestCall()
{
    HttpClient client = new HttpClient();
    HttpResponseMessage response = await client.GetAsync("https://http://myrest.com");
    if (response.IsSuccessStatusCode)
    {
        var sw = new Stopwatch();
        sw.Start();
        var x = await response.Content.ReadAsStringAsync();
        sw.Stop();
        Console.WriteLine($"{x.Length} {sw.ElapsedMilliseconds}");
    }
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Другие способы просмотра Elapsed Time HttpClient

1. Изменение Уровень записи до Information или Trace

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      //"System.Net.Http.HttpClient": "Information"
    }
  }
}

Пример вывода

info: System.Net.Http.HttpClient.MyClient.LogicalHandler[100]
  Start processing HTTP request GET https://api.github.com/repos/aspnet/docs/branches

info: System.Net.Http.HttpClient.MyClient.ClientHandler[100]
  Sending HTTP request GET https://api.github.com/repos/aspnet/docs/branches

info: System.Net.Http.HttpClient.MyClient.ClientHandler[101]
  Received HTTP response after 682.9818ms - OK

info: System.Net.Http.HttpClient.MyClient.LogicalHandler[101]
  End processing HTTP request after 693.1094ms - OK

2. Создание нового обработчика

public class TimingHandler : DelegatingHandler
{
    private readonly ILogger<TimingHandler> _logger;

    public TimingHandler(ILogger<TimingHandler> logger)
    {
        _logger = logger;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, 
        CancellationToken cancellationToken)
    {
        var sw = Stopwatch.StartNew();

        _logger.LogInformation("Starting request");

        var response = await base.SendAsync(request, cancellationToken);

        _logger.LogInformation($"Finished request in {sw.ElapsedMilliseconds}ms");

        return response;
    }
}

Подробнее

0 голосов
/ 01 декабря 2018

Вы должны переместить секундомер, чтобы включить также ваш .GetAsync звонок.

public static async Task DoRestCall()
{
    HttpClient client = new HttpClient();
    string responseBody = String.Empty;
    var sw = new Stopwatch();
    sw.Start();
    HttpResponseMessage response = await client.GetAsync("https://http://myrest.com");
    if (response.IsSuccessStatusCode)
    {        
        responseBody = await response.Content.ReadAsStringAsync();
    }
    sw.Stop();    
    Console.WriteLine($"{responseBody.Length} {sw.ElapsedMilliseconds}");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...