视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
为HttpClient添加默认请求报头的四种解决方案
2020-11-27 22:34:27 责编:小采
文档


前言

HttpClient在Web调用中具有广泛的应用,而为它添加默认请求头是我们经常遇到的需求,本文介绍4种为HttpClient添加默认请求头的方式。下面话不多说了,来一起看看详细的介绍吧

第一种方式

直接在创建的HttpClient对象的DefaultRequestHeaders集合中添加报头。

class Program
{
 static Task Main()=> SendAsync1();

 private static async Task SendAsync1()
 {
 var httpClient = new HttpClient();
 AddDefaultHeaders(httpClient);
 await httpClient.GetStringAsync("http://localhost:5000/");
 }

 private static void AddDefaultHeaders(HttpClient httpClient)
 {
 httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");
 httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");
 httpClient.DefaultRequestHeaders.Add("x-www-baz", "7");
 }
}

第二种方式

对于.NET Core应用来说,我们更推荐的做法是采用依赖注入的方式,利用IHttpClientFactory来创建HttpClient对象,那么我们在进行相关服务注册的时候就可以设置默认请求报头。

class Program
{
 static Task Main()=> SendAsync2();

 private static async Task SendAsync2()
 {
 var services = new ServiceCollection();
 services.AddHttpClient("", AddDefaultHeaders);
 var httpClient = services
 .BuildServiceProvider()
 .GetRequiredService<IHttpClientFactory>()
 .CreateClient();
 await httpClient.GetStringAsync("http://localhost:5000/");
 }

 private static void AddDefaultHeaders(HttpClient httpClient)
 {
 httpClient.DefaultRequestHeaders.Add("x-www-foo", "123");
 httpClient.DefaultRequestHeaders.Add("x-www-bar", "456");
 httpClient.DefaultRequestHeaders.Add("x-www-baz", "7");
 }
}

第三种方式

由于HttpClient在发送请求的时候会利用DiagnosticSource对象发送相应的诊断事件,并且将作为请求的HttpRequestMessage对象作为请求事件内容负载。我们可以订阅该事件,在请求被发送之前将其拦截下来,并添加相应的请求头即可。

class Program
{
 static Task Main()=> SendAsync3();

 private static async Task SendAsync3()
 {
 Func<object, HttpRequestMessage> requestAccessor = null;
 DiagnosticListener.AllListeners.Subscribe(listener =>
 {
 if (listener.Name == "HttpHandlerDiagnosticListener")
 {
 listener.Subscribe(kv =>
 {
 if (kv.Key == "System.Net.Http.HttpRequestOut.Start")
 {
 requestAccessor ??= BuildRequestAccessor(kv.Value.GetType());
 var request = requestAccessor(kv.Value);
 AddDefaultHeaders(request);
 }
 });
 }
 });

 var httpClient = new HttpClient();
 await httpClient.GetStringAsync("http://localhost:5000/");
 static Func<object, HttpRequestMessage> BuildRequestAccessor(Type payloadType)
 {
 var property = payloadType.GetProperty("Request", BindingFlags.Instance | BindingFlags.Public);
 var payload = Expression.Parameter(typeof(object));
 var convertedPayload = Expression.Convert(payload, payloadType);
 var getRequest = Expression.Call(convertedPayload, property.GetMethod);
 var convert = Expression.Convert(getRequest, typeof(HttpRequestMessage));
 return Expression.Lambda<Func<object, HttpRequestMessage>>(convert, payload).Compile();
 }
 }

 private static void AddDefaultHeaders(HttpRequestMessage request)
 {
 request.Headers.Add("x-www-foo", "123");
 request.Headers.Add("x-www-bar", "456");
 request.Headers.Add("x-www-baz", "7");
 }
}

第四种方式

上面这种方式可以采用强类型编程方式,具体的代码如下。

class Program
{
 static Task Main()=> SendAsync4();

 private static async Task SendAsync4()
 {
 DiagnosticListener.AllListeners.Subscribe(listener =>
 {
 if (listener.Name == "HttpHandlerDiagnosticListener")
 {
 listener.SubscribeWithAdapter(new HttpClientListener());
 }
 });
 
 var httpClient = new HttpClient();
 await httpClient.GetStringAsync("http://localhost:5000/");
 }

 private sealed class HttpClientListener
 {
 [DiagnosticName("System.Net.Http.HttpRequestOut.Start")]
 public void OnSend(HttpRequestMessage request) => AddDefaultHeaders(request);

 //Must subscribute the System.Net.Http.HttpRequestOut event.
 [DiagnosticName("System.Net.Http.HttpRequestOut")]
 public void OnSend() { }
 }

 private static void AddDefaultHeaders(HttpRequestMessage request)
 {
 request.Headers.Add("x-www-foo", "123");
 request.Headers.Add("x-www-bar", "456");
 request.Headers.Add("x-www-baz", "7");
 }
}

总结

下载本文
显示全文
专题