你能为HttpClient提供多个HTTP消息处理程序吗?

时间:2016-08-02 10:34:22

标签: asp.net asp.net-mvc dotnet-httpclient

我需要查询发送可以加密和/或压缩和/或Base64编码的响应的Web API,并且我希望将其实现为HttpMessageHandler s链非常类似在this post中概述,但是用于Web API。

HttpClientHttpMessageHandler的构造函数,因此这是一个开始。我是否必须想出一个自己链接多个处理程序的解决方案,还是有更好的选择?

1 个答案:

答案 0 :(得分:4)

链接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(...))));