四种为HttpClient添加默认请求报头的解决方案
发布时间:2020-12-16 09:11:00 所属栏目:asp.Net 来源:网络整理
导读:HttpClient在Web调用中具有广泛的应用,而为它添加默认请求头是我们经常遇到的需求,本文介绍4种为HttpClient添加默认请求头的方式。 第一种方式 直接在创建的HttpClient对象的DefaultRequestHeaders集合中添加报头。 class Program{ static Task Main()= Se
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/"); } void AddDefaultHeaders(HttpClient httpClient) { httpClient.DefaultRequestHeaders.Add(x-www-foo",123); httpClient.DefaultRequestHeaders.Add(x-www-bar456x-www-baz789); } } 第二种方式对于.NET Core应用来说,我们更推荐的做法是采用依赖注入的方式,利用IHttpClientFactory来创建HttpClient对象,那么我们在进行相关服务注册的时候就可以设置默认请求报头。 SendAsync2();
Task SendAsync2()
{
var services = ServiceCollection();
services.AddHttpClient("",AddDefaultHeaders);
var httpClient = services
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>()
.CreateClient();
);
}
);
}
}
第三种方式由于HttpClient在发送请求的时候会利用DiagnosticSource对象发送相应的诊断事件,并且将作为请求的HttpRequestMessage对象作为请求事件内容负载。我们可以订阅该事件,在请求被发送之前将其拦截下来,并添加相应的请求头即可。 SendAsync3();
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);
}
});
}
});
HttpClient();
);
static Func< BuildRequestAccessor(Type payloadType)
{
var property = payloadType.GetProperty(Request 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<(convert,payload).Compile();
}
}
AddDefaultHeaders(HttpRequestMessage request)
{
request.Headers.Add();
request.Headers.Add();
}
}
第四种方式上面这种方式可以采用强类型编程方式,具体的代码如下。 SendAsync4();
Task SendAsync4()
{
DiagnosticListener.AllListeners.Subscribe(listener =>)
{
listener.SubscribeWithAdapter( HttpClientListener());
}
});
sealed HttpClientListener
{
[DiagnosticName()]
public void OnSend(HttpRequestMessage request) => AddDefaultHeaders(request);
//Must subscribute the System.Net.Http.HttpRequestOut event.
[DiagnosticName(System.Net.Http.HttpRequestOut OnSend() { }
}
);
}
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 自定义DataAnnotations Validator派生自Reg
- asp.net – 可以创建.config文件并将其包含到web.config中吗
- asp.net-web-api – MVC Core ZipArchive无效
- asp.net – 在Sitecore中检索URL路径部分的方法是什么?
- ASP.NET Requests Queued导致网站崩溃. SQL后端,IIS6
- 在asp.net core中使用托管服务实现后台任务
- asp.net-mvc-3 – MVC:为此对象定义的无参数构造函数
- 执行迁移EF core 2.0时出错,将Identity id从string更改为in
- ASP.NET Core 新建项目(Windows) - ASP.NET Core 基础教程
- asp.net-mvc – Unity.Mvc3 vs Unity.Mvc
推荐文章
站长推荐
热点阅读