如何在.NET Framework 4.6.1中用Autofac和Polly配置HttpClient
.NET Framework 4.6.1下Autofac+Polly配置强类型HttpClient方案
需求与问题
现有遗留应用通过HttpClient与Web API后端交互,需在Autofac依赖注入容器中配置多个HttpClient,要求包含:
- 超时设置
- Polly重试策略
- 委托处理程序
预配置的HttpClient需注入到其他服务构造函数中,同时要实现封装完整逻辑的强类型客户端,且该客户端可通过构造函数接收参数,从应用配置中设置特定属性。
但多数示例和文档针对.NET Core框架,找不到.NET Framework 4.6.1下Autofac+Polly的适配配置示例,目前初步代码如下:
// Autofac依赖注入容器中的配置 builder.Register(c => c.Resolve<IHttpClientFactory>() // 疑问:如何在DI容器中应用Polly策略? // 疑问:如何将appsettings的值传递给StrongTypedHttpClient构造函数? // 疑问:如何传递委托处理程序? .CreateClient()) .As<StrongTypedHttpClient>(); public class StrongTypedHttpClient { private readonly HttpClient _httpClient; public StrongTypedHttpClient(HttpClient httpClient) { _httpClient = httpClient; // 疑问:如何将Polly策略应用到HttpClient实例? // 疑问:如何获取应用配置? } // HttpClient业务逻辑方法 } // 使用预配置强类型HttpClient的消费者类 public class Consumer { private readonly StrongTypedHttpClient _httpClient; public Consumer(StrongTypedHttpClient httpClient) { _httpClient = httpClient; } }
请问该如何实现?
更新:已完成的配置方案
按照建议使用Microsoft.Extensions.Http中的HttpClientBuilder接口后,已成功实现需求,强类型HttpClient在Autofac容器中的配置代码如下:
var settings = GetRefreshTokenSettings(); builder.RegisterInstance(settings).AsSelf(); // 定义Polly重试策略:处理瞬时HTTP错误、超时拒绝异常,线性退避重试 var retryPolicy = HttpPolicyExtensions .HandleTransientHttpError() .Or<TimeoutRejectedException>() .WaitAndRetryAsync(Backoff.LinearBackoff(TimeSpan.FromMilliseconds(300), retryCount: settings.TokenHttpClientRetryCount)); // 定义Polly超时策略 var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(settings.TokenHttpClientTimeoutInSeconds); // Autofac中注册配置好的强类型HttpClient builder.Register(c => c.Resolve<IHttpClientBuilder>() .AddTypedClient<StrongTypedHttpClient>() .AddPolicyHandler(retryPolicy) .AddPolicyHandler(timeoutPolicy));
内容的提问来源于stack exchange,提问作者Oblomingo
相关产品推荐
相关产品推荐

