当您在 DI 容器注册阶段注册 IHttpClient 或使用其他模式(例如工厂或单例)返回带有自定义消息处理程序的 IHttpClient 实例时,将消息处理程序与您的 HttpClient 连接起来。检查出站呼叫并添加必要的标头。
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/httpclient-message-handlers
示例标头消息处理程序
class MessageHandler1 : DelegatingHandler
{
private int _count = 0;
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
System.Threading.Interlocked.Increment(ref _count);
request.Headers.Add("X-Custom-Header", _count.ToString());
return base.SendAsync(request, cancellationToken);
}
}
示例记录器消息处理程序:
class LoggingHandler : DelegatingHandler
{
StreamWriter _writer;
public LoggingHandler(Stream stream)
{
_writer = new StreamWriter(stream);
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (!response.IsSuccessStatusCode)
{
_writer.WriteLine("{0}\t{1}\t{2}", request.RequestUri,
(int)response.StatusCode, response.Headers.Date);
}
return response;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_writer.Dispose();
}
base.Dispose(disposing);
}
}
将其添加到管道中
HttpClient client = HttpClientFactory.Create(new Handler1(), new Handler2(), new Handler3());
线程问题
关于线程问题或并发,HttpRequestMessage 方法上的 HttpRequestMessage 参数将针对每个请求。如果您将标头添加到 request.Headers 集合,您将仅更新该请求实例的标头(即,不是全局的)
或者在request.Headers 实例上使用 Authorization 属性:
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);
请参阅下面的 MSDN 链接
https://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage
如果您在 HttpClient 的静态、共享、单例、Lifestyle.Singleton 等实例上使用 DefaultRequestHeaders,那么您将遇到线程问题并且需要适当的同步来更新 DefaultRequestHeaders 集合。