using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace HttpClientStudy.Core { /// /// 管道方式 HttpClient客户端 /// public class PipelineHttpClient { public List HttpMessageHandlers { get; set; } public PipelineHttpClient() { HttpMessageHandlers = new List() { new CustomHeadersHandler(), new LoggingHandler(), }; } public PipelineHttpClient(List httpMessageHandlers) { HttpMessageHandlers = httpMessageHandlers; if (httpMessageHandlers == null || httpMessageHandlers?.Count == 0) { HttpMessageHandlers = new List(); } } public void AddDelegatingHandler(DelegatingHandler handler) { this.HttpMessageHandlers.Add(handler); } public HttpClient CreateHttpClient() { //创建处理器链 //最终处理器:最后一个请求处理程序,默认是SocketsHttpHandler. HttpMessageHandler currentPipeLine = new SocketsHttpHandler() { //自定义配置 PooledConnectionLifetime = TimeSpan.FromSeconds(120), }; //pipeline = new CustomHeadersHandler() { InnerHandler = pipeline}; //pipeline = new LoggingHandler () { InnerHandler = pipeline}; //倒序组装:完成后执行顺序与注册顺序一致 HttpMessageHandlers.Reverse(); for (int i = 0; i < HttpMessageHandlers.Count; i++) { HttpMessageHandlers[i].InnerHandler = currentPipeLine; currentPipeLine = HttpMessageHandlers[i]; } // 利用管道创建HttpClient var httpClient = new HttpClient(currentPipeLine); return httpClient; } } /// /// 默认处理器1 - 添加自定义请求头 /// public class CustomHeadersHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 在请求中添加自定义头部 request.Headers.Add("X-Custom-Header", "CustomValue"); // 调用管道中的下一个处理器 return await base.SendAsync(request, cancellationToken); //响应信息(可不处理) } } /// /// 默认处理器1 - 简单的日志记录 /// public class LoggingHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 记录请求信息 Console.WriteLine($"Request: {request.Method} {request.RequestUri}"); // 调用管道中的下一个处理器,并获取响应 var response = await base.SendAsync(request, cancellationToken); // 记录响应信息 Console.WriteLine($"Response: {response.StatusCode}"); return response; } } }