0

我使用 .net core 3.1 和 Polly 7.2.0 在我的解决方案中实现了 Polly。我为 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
            });
...

外部客户端

...
    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。我已经检查了Polly 的文档,并且也看到了使用 WebClient 的这种方法,但是如果策略和实现在同一个地方,这将起作用。我相信,如果我在一个方法中发生 http 客户端调用,我可以用 ExecuteAsync 包装对它的调用,然后提供不同的客户端,那么我相信这是有可能做到的,但我正在寻找一个更优雅的解决方案,可能存在但我不知道。

4

1 回答 1

0

其他问题所述System.Net.Http.HttpClient并非旨在BaseAddress更改。

但是,您不必使用不同的HttpClient实例来定位具有不同基地址的 URI。您可以简单地不设置您配置的BaseAddress属性HttpClient,并在通过单个HttpClient实例发出的调用中使用完全限定的 URI(例如在主 URI 和故障转移 URI 之间切换)。

于 2020-05-02T08:33:30.777 回答