Можно ли изменить BaseAddress клиента или клиента при использовании Polly ExecuteAsyn c после неудачной попытки? - PullRequest
0 голосов
/ 27 апреля 2020

Я реализовал Polly в своем решении, используя. net core 3.1 и Polly 7.2.0. Я создал расширения для IServiceCollection и в своем файле запуска я вызываю расширения для настройки и добавления клиента, а также для создания политики и ее регистрации.

В своем классе ExternalClient я использую IHttpClientFactory для использовать мой клиент и политику IAsyncPolicy, чтобы обернуть мои вызовы политикой, которую я создал и настроил при запуске.

Startup.cs

...
services.AddHttpClients(Configuration);
services.AddRetryPolicy(Configuration);
...

ServiceCollectionExtension.cs

...
var policy = Policy
            .Handle<HttpRequestException>()
            .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(retryCount), (exception, timeSpan, count, 
context) =>
            {
                LogTo.Error($"Failed while posting to {myClient.Host}, retrying: " +
                            $"{count} of {retryCount} in " +
                            $"{timeSpan.TotalSeconds} seconds, with exception " +
                            $"{exception.Message}");
            });

            services.AddHttpClient("MyClient", c => { c.BaseAddress = new Uri(myClient.Host); })
            .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
            {
                Credentials = credentialsCache
            });
...

ExternalClient

...
    try
    {
        var response = await _policy
            .ExecuteAsync(async () => (await _client.PostAsync(endpoint, requestBody)).EnsureSuccessStatusCode())
            .ConfigureAwait(false);
        return response.StatusCode == HttpStatusCode.OK;
    }
    catch (Exception ex)
    {
        LogTo.Error(ex, "Unable to contact Myclient");
    }
...

Реализация политики работает нормально, следующий шаг - проверить, есть ли способ добавить URL-адрес аварийного переключения для моего клиента. Я проверил документацию для Полли, а также видел этот подход с WebClient, но это сработало бы, если бы политика и реализация находились в одном месте. Я полагаю, что было бы возможно сделать это, если бы у меня был вызов клиента http в методе, где я мог бы обернуть вызов этим с помощью ExecuteAsyn c, а затем предоставить другой клиент, но я искал более элегантное решение, что-то, что может быть там, но я не знаю.

1 Ответ

0 голосов
/ 02 мая 2020

Поскольку рассматривается в других вопросах , System.Net.Http.HttpClient не предназначен для изменения BaseAddress.

Однако вам не нужно использовать разные экземпляры HttpClient для целевых URI с разными базовыми адресами. Вы можете просто не устанавливать свойство BaseAddress для настроенного HttpClient и использовать полные URI (например, для переключения между основным и отказоустойчивым URI) в вызовах, которые вы совершаете через один HttpClient экземпляр.

...