using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HttpClientStudy.UnitTest.HttpClients { /// /// 管道构建器 /// public class HttpMessageHandlerBuilder { public List Handlers { get; set; } public HttpMessageHandlerBuilder() { this.Handlers = new List(); } public HttpMessageHandlerBuilder(List handlers) : base() { if (handlers != null) { this.Handlers = handlers; } } public void AddHttpMessageHandler(DelegatingHandler handler) { Handlers.Add(handler); } public void RemoveHttpMessageHandler(DelegatingHandler handler) { Handlers.Remove(handler); } public List FindHttpMessageHandler(DelegatingHandler handler) { return Handlers.Where(h => h.GetType() == handler.GetType()).ToList(); } /// /// 根据管道配置:创建一个新HttpClient实例 /// public HttpClient Build() { if (this.Handlers == null || this.Handlers.Count == 0) { return new HttpClient(); } //默认最终处理器 HttpMessageHandler defaultLastHandler = new SocketsHttpHandler() { //自定义配置 PooledConnectionLifetime = TimeSpan.FromSeconds(120), }; //倒序组装:完成后执行顺序与注册顺序一致 //拷贝份,省得多次调用有问题 HttpMessageHandler currentHandler = new SocketsHttpHandler() { //自定义配置 PooledConnectionLifetime = TimeSpan.FromSeconds(120), }; var builderHandlers = this.Handlers.ToList(); builderHandlers.Reverse(); if (builderHandlers[0].InnerHandler != null) { currentHandler = builderHandlers[0].InnerHandler; } for (int i = 0; i < builderHandlers.Count; i++) { builderHandlers[i].InnerHandler = currentHandler; currentHandler = builderHandlers[i]; } // 利用管道创建HttpClient var httpClient = new HttpClient(currentHandler); return httpClient; } } }