HttpClient 可以有多个 HTTP 消息处理程序吗?
Can you have more than one HTTP Message Handler for HttpClient?
我需要查询一个 Web API,它发送可以加密 and/or 压缩 and/or Base64 编码的响应,我想将其实现为 HttpMessageHandler
与 this 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(...))));
我需要查询一个 Web API,它发送可以加密 and/or 压缩 and/or Base64 编码的响应,我想将其实现为 HttpMessageHandler
与 this 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(...))));