HttpClient 可以有多个 HTTP 消息处理程序吗?

Can you have more than one HTTP Message Handler for HttpClient?

我需要查询一个 Web API,它发送可以加密 and/or 压缩 and/or Base64 编码的响应,我想将其实现为 HttpMessageHandlerthis post 中概述的非常相似,但它适用于 Web API。

有一个 HttpClient 的构造函数采用 HttpMessageHandler,所以这是一个开始。我是否必须自己想出一个链接多个处理程序的解决方案,或者是否有更好的选择?

链接 HttpMessageHandler 的最简单方法是从 DelegatingHandler 继承,它在其构造函数中采用内部 HttpMessageHandler,并在其基础 SendAsync 中调用它实施。

public class MyHandler1 : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, 
        CancellationToken cancellationToken)
    {
        // do something before the inner handler runs (modify the request?)

        var response =  await base.SendAsync(request, cancellationToken);

        // do something after the inner handler runs (modify the repsonse?)

        return response;
    }
}

有了其中的多个,在构造 HttpClient:

时,您可以按任意顺序将它们链接在一起
var client = new HttpClient(
    new MyHandler1(
        new MyHandler2(
            new MyHandler3(...))));