四种为HttpClient添加默认请求报头的解决方案
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", "789");
}
}
第二种方式
对于.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", "789");
}
}
第三种方式
由于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", "789");
}
}
第四种方式
上面这种方式可以采用强类型编程方式,具体的代码如下。
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", "789");
}
}
四种为HttpClient添加默认请求报头的解决方案的更多相关文章
- (七)四种常见的post请求中的参数形式
原文链接:https://blog.csdn.net/jiadajing267/article/details/87883725 1).HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP ...
- Android Activity的四种经典传值方法
文/ http://blog.csdn.net/sk719887916/article/details/41723613 skay 开发中遇到多个activity的传值问题 相邻两个之间的传值 或者 ...
- Android四种启动模式
四种启动模式 standard(默认) singleTop singleTast singleInstance standard(默认) 系统默认的启动模式. Android是使用返回栈来管理活动的, ...
- android点击事件的四种方式
android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...
- this的四种绑定规则总结
一.默认绑定 1.全局环境中,this默认绑定到window 2.函数独立调用时,this默认绑定到window console.log(this === window);//true functio ...
- httpClient Post例子,Http 四种请求访问代码 HttpGet HttpPost HttpPut HttpDelete
httpclient post方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //----1. HttpPost request = new HttpPost(ur ...
- Python实现接口测试中的常见四种Post请求数据
前情: 在日常的接口测试工作中,模拟接口请求通常有两种方法, 利用工具来模拟,比如fiddler,postman,poster,soapUI等 利用代码来模拟,使用到一些网络模块,比如HttpClie ...
- 接口测试中模拟post四种请求数据
https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...
- Django的POST请求时因为开启防止csrf,报403错误,及四种解决方法
Django默认开启防止csrf(跨站点请求伪造)攻击,在post请求时,没有上传 csrf字段,导致校验失败,报403错误 解决方法1: 注释掉此段代码,即可. 缺点:导致Django项目完全无法防 ...
随机推荐
- win10安装.NET Framework 3.5方法
win10下默认没有.NET Framework 3.5,但是有时候我们运行一些网络相关的软件要用到它,下面是它的具体安装方法(绝对可以成功) 将系统镜像挂载到虚拟光驱 复制虚拟光驱下的\source ...
- 【Android】java.lang.SecurityException: getDeviceId: Neither user 10065 nor current process has android.permission.READ_PHONE_STATE
RT, 异常信息如下: java.lang.SecurityException: getDeviceId: Neither user 10065 nor current process has and ...
- Task CancellationTokenSource和Task.WhenAll的应用
Task是.net4.0推出的异步编程类,与ThreadPool.QueneUserWorkItem方法类似的是,Task也是使用线程池来工作的.但Task比起这个QueneUserWorkItem的 ...
- GridView 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- java并发编程(二十二)----(JUC集合)ConcurrentHashMap介绍
这一节我们来看一下并发的Map,ConcurrentHashMap和ConcurrentSkipListMap.ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全 ...
- Vue系列:Slot 插槽的使用范例
插槽对于自定义的组件开发来说,是十分强大的功能.这篇主要做个简单梳理 插槽可以分3种: 1.简单插槽 2.具名插槽 3.作用域插槽
- Spark 系列(十五)—— Spark Streaming 整合 Flume
一.简介 Apache Flume 是一个分布式,高可用的数据收集系统,可以从不同的数据源收集数据,经过聚合后发送到分布式计算框架或者存储系统中.Spark Straming 提供了以下两种方式用于 ...
- SpringBoot中Shiro缓存使用Redis、Ehcache
在SpringBoot中Shiro缓存使用Redis.Ehcache实现的两种方式实例 SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这sh ...
- 身体质量指数BMI
Solution: 方法一:"Python语言程序设计"(中国大学MOOC平台)的答案 分析:对比两种指标,将共性(相同的区间)和异性(不同的区间)细分.这样两种指标的判断条件(不 ...
- 帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析
帝国CMS(EmpireCMS) v7.5配置文件写入漏洞分析 一.漏洞描述 该漏洞是由于安装程序时没有对用户的输入做严格过滤,导致用户输入的可控参数被写入配置文件,造成任意代码执行漏洞. 二.漏洞复 ...