How to configure an polly policy for HttpClient in Autofac ContainerBuilder in .Net 6

问题描述 投票:0回答:2

我想在 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);
        });
}

DI注册

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>();

代码没有错误。它不会启动重试。

c# autofac dotnet-httpclient polly ihttpclientfactory
2个回答
1
投票

我认为您应该在构建集合之前调用

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.


-1
投票

我使用下面的代码在 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>();
        });
© www.soinside.com 2019 - 2024. All rights reserved.