6.17HTTP 请求管道处理器

HTTP 请求管道处理器是框架发送 HTTP 远程请求的核心机制,实际发出请求的最终执行逻辑即由这一系列处理器协作完成。几乎所有关键特性——如自动重定向、请求分析、超时管理、重试策略、异常抑制、请求断言及 Access Token 自动管理等——均由独立的管道处理器实现。每个处理器只关注单一职责,便于扩展和维护。

HTTP 请求管道处理器是框架发送 HTTP 远程请求的核心机制,实际发出请求的最终执行逻辑即由这一系列处理器协作完成。几乎所有关键特性——如自动重定向、请求分析、超时管理、重试策略、异常抑制、请求断言及 Access Token 自动管理等——均由独立的管道处理器实现。每个处理器只关注单一职责,便于扩展和维护。

若要自定义管道处理器,只需实现 IHttpRequestPipelineHandler 接口。例如,以下示例实现了一个简单的打印处理器,在请求前后输出日志:

cs
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.csProgram.cs 中配置 HttpRemote 服务时,通过 AddPipelineHandler 注册该处理器即可启用:

cs
services.AddHttpRemote(builder =>{    builder.AddPipelineHandler<PrintPipelineHandler>();});

注册后,每个远程请求在发出前会打印“请求之前”,收到响应后会打印“接收响应”,从而直观地观察请求生命周期。

HttpRequestPipelineContext 包含以下属性:

  • 属性
    • OriginalBuilder:原始的 HttpRequestBuilderHttpRequestBuilder 类型)。
    • Builder:当前使用的 HttpRequestBuilderHttpRequestBuilder 类型)。
    • HttpClientHttpClient 实例(HttpClient 类型)。
    • CompletionOption:指示响应内容操作方式(HttpCompletionOption 类型)。
    • CancellationToken:当前有效的取消操作标识(CancellationToken 类型)。
    • SendAsync:发送委托(Func<HttpClient, HttpRequestMessage, HttpCompletionOption, CancellationToken, Task<HttpResponseMessage>> 类型)。真正发出 HTTP 请求的委托。
    • RequestMessage:最近一次构建的 HttpRequestMessageHttpRequestMessage? 类型)。
    • ResponseMessage:最近一次构建的 HttpResponseMessageHttpResponseMessage? 类型)。
    • RequestDuration:请求耗时(毫秒)(long 类型)。
    • Items:共享数据字典(IDictionary<object, object?> 类型)

若需了解框架内置的所有请求管道处理器,可参阅仓库源码:https://gitee.com/dotnetchina/HttpAgent/tree/master/src/HttpAgent/src/Pipelines/Handlers