我使用 .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 包装对它的调用,然后提供不同的客户端,那么我相信这是有可能做到的,但我正在寻找一个更优雅的解决方案,可能存在但我不知道。