【问题标题】:Can you have more than one HTTP Message Handler for HttpClient?可以为 HttpClient 提供多个 HTTP 消息处理程序吗?
【发布时间】:2016-08-02 10:34:22
【问题描述】:
我需要查询发送可以加密和/或压缩和/或 Base64 编码的响应的 Web API,我想将其实现为HttpMessageHandlers 链,非常类似于@987654321 中所述@,虽然是用于 Web API。
HttpClient 的构造函数采用HttpMessageHandler,所以这是一个开始。我是否必须自己想出一个链接多个处理程序的解决方案,或者是否有更好的选择?
【问题讨论】:
标签:
asp.net
asp.net-mvc
dotnet-httpclient
【解决方案1】:
链接HttpMessageHandlers 的最简单方法是从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(...))));