Как использовать заголовок retry-after для опроса API с использованием asp. net http-клиента - PullRequest
1 голос
/ 10 июля 2020

Я как бы новичок в использовании RESTful с использованием http-клиента в. net, и мне сложно понять, как использовать заголовок retry-after при опросе внешнего API.

Это то, что Сейчас мне нужно опросить:

HttpResponseMessage result = null;
var success = false;
var maxAttempts = 7;
var attempts = 0;

using (var client = new HttpClient()) 
{
    do
    {
        var url = "https://xxxxxxxxxxxxxxx";
        result = await client.GetAsync(url);

        attempts++;

        if(result.StatusCode == HttpStatusCode.OK || attempts == maxAttempts) 
           success = true;
    }
    while (!success);
}

return result;

Как видите, я продолжаю опрашивать конечную точку до тех пор, пока не получу ответ «ОК» или пока не будет достигнуто максимальное количество попыток (чтобы остановить непрерывный цикл).

Как я могу использовать заголовок retry-after из ответа, который я могу указать, как долго я буду ждать между каждым из вызовов в l oop?

Я просто не могу понять, как подать заявку это в моей ситуации.

Спасибо,

1 Ответ

2 голосов
/ 11 июля 2020

HttpClient предназначен для создания экземпляра один раз для каждого приложения, а не для каждого использования

private static HttpClient client = new HttpClient();

Метод (обновляется с использованием заголовка хоста HTTP)

private static async Task<string> GetDataWithPollingAsync(string url, int maxAttempts, string host = null)
{
    using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url))
    {
        if (host?.Length > 0) request.Headers.Host = host;
        for (int attempt = 0; attempt < maxAttempts; attempt++)
        {
            TimeSpan delay = default;
            using (HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false))
            {
                if (response.IsSuccessStatusCode)
                    return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                delay = response.Headers.RetryAfter.Delta ?? TimeSpan.FromSeconds(1);
            }
            await Task.Delay(delay);
        }
    }
    throw new Exception("Failed to get data from server");
}

Использование

try
{
    string result = await GetDataWithPollingAsync("http://some.url", 7, "www.example.com");
    // received
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
    // failed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...