6.17HTTP 请求管道处理器
HTTP 请求管道处理器是框架发送 HTTP 远程请求的核心机制,实际发出请求的最终执行逻辑即由这一系列处理器协作完成。几乎所有关键特性——如自动重定向、请求分析、超时管理、重试策略、异常抑制、请求断言及 Access Token 自动管理等——均由独立的管道处理器实现。每个处理器只关注单一职责,便于扩展和维护。
HTTP 请求管道处理器是框架发送 HTTP 远程请求的核心机制,实际发出请求的最终执行逻辑即由这一系列处理器协作完成。几乎所有关键特性——如自动重定向、请求分析、超时管理、重试策略、异常抑制、请求断言及 Access Token 自动管理等——均由独立的管道处理器实现。每个处理器只关注单一职责,便于扩展和维护。
若要自定义管道处理器,只需实现 IHttpRequestPipelineHandler 接口。例如,以下示例实现了一个简单的打印处理器,在请求前后输出日志:
internal sealed class PrintPipelineHandler : IHttpRequestPipelineHandler{ /// <inheritdoc /> public async Task<HttpResponseMessage?> HandleAsync(HttpRequestPipelineContext context, Func<Task<HttpResponseMessage?>> next) { Console.WriteLine("请求之前"); // 调用下一个处理器的委托 var httpResponseMessage = await next(); Console.WriteLine("接收响应"); return httpResponseMessage; }}接着,在 Startup.cs 或 Program.cs 中配置 HttpRemote 服务时,通过 AddPipelineHandler 注册该处理器即可启用:
services.AddHttpRemote(builder =>{ builder.AddPipelineHandler<PrintPipelineHandler>();});注册后,每个远程请求在发出前会打印“请求之前”,收到响应后会打印“接收响应”,从而直观地观察请求生命周期。
HttpRequestPipelineContext 包含以下属性:
- 属性:
OriginalBuilder:原始的HttpRequestBuilder(HttpRequestBuilder类型)。Builder:当前使用的HttpRequestBuilder(HttpRequestBuilder类型)。HttpClient:HttpClient实例(HttpClient类型)。CompletionOption:指示响应内容操作方式(HttpCompletionOption类型)。CancellationToken:当前有效的取消操作标识(CancellationToken类型)。SendAsync:发送委托(Func<HttpClient, HttpRequestMessage, HttpCompletionOption, CancellationToken, Task<HttpResponseMessage>>类型)。真正发出HTTP请求的委托。RequestMessage:最近一次构建的HttpRequestMessage(HttpRequestMessage?类型)。ResponseMessage:最近一次构建的HttpResponseMessage(HttpResponseMessage?类型)。RequestDuration:请求耗时(毫秒)(long类型)。Items:共享数据字典(IDictionary<object, object?>类型)
若需了解框架内置的所有请求管道处理器,可参阅仓库源码:https://gitee.com/dotnetchina/HttpAgent/tree/master/src/HttpAgent/src/Pipelines/Handlers