我想在 Autofac 容器中使用重试策略配置 httpClient。下面的代码不会启动重试。我错过了什么吗?
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode != System.Net.HttpStatusCode.OK)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(retryAttempt),
(exception, timeSpan, retryCount, context) =>
{
Task.Delay(5000);
});
}
var services = new ServiceCollection();
services.AddHttpClient();
var providerFactory = new AutofacServiceProviderFactory();
ContainerBuilder builder = providerFactory.CreateBuilder(services);
builder.Register(c => c.Resolve<IHttpClientBuilder>()
.AddPolicyHandler(GetRetryPolicy()));
builder.Register(c => c.Resolve<IHttpClientFactory>().CreateClient())
.As<HttpClient>();
代码没有错误。它不会启动重试。
我认为您应该在构建集合之前调用
AddPolicyHandler
,而不是之后。
var services = new ServiceCollection();
services.AddHttpClient()
.AddPolicyHandler(GetRetryPolicy());
var providerFactory = new AutofacServiceProviderFactory();
var builder = providerFactory.CreateBuilder(services);
builder.Register(c => c.Resolve<IHttpClientFactory>().CreateClient())
.As<HttpClient>();
我还建议看看这个 SO thread.
我使用下面的代码在 Autofac 容器中使用 Polly 策略注册 IhttpClientFactory。
builder.Register<IHttpClientFactory>(_ =>
{
var services = new ServiceCollection();
services.AddHttpClient("MyClient", client =>
{
client.BaseAddress = new Uri("https://myapi.com");
client.DefaultRequestHeaders.Add("accept", "application/json");
}).AddPolicyHandler(GetRetryPolicy());
var provider = services.BuildServiceProvider();
return provider.GetRequiredService<IHttpClientFactory>();
});