四种为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");
}
}


原文链接:https://www.cnblogs.com/artech/p/add-headers-for-httpclient.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【盛派内部分享资料】本期主题:使用JavaScript HTML CSS构建跨平台桌面应用

先上录制视频友情提示&#xff1a;如果公众号内视频无法显示高清视频&#xff0c;您也可以在小程序内观看高清视频&#xff0c;点击下方按钮观看&#xff1a;【盛派内部分享资料】本期主题&#xff1a;使用JavaScript HTML CSS构建跨平台桌面应用本次活动由盛派技术人员伏允坤主…

负载均衡及负载均衡器

负载均衡在分布式系统中&#xff0c;负载均衡&#xff08;load balancing&#xff09;是一种有效的将网络请求分配到多个服务器的过程。通过将负载进行负载均衡&#xff0c;可以有效地改进系统响应时间&#xff0c;提高系统的可用性。随着系统变的愈发复杂&#xff0c;用户增多…

VS Code 摸鱼插件开发小记

插件地址&#xff1a;https://marketplace.visualstudio.com/items?itemNamebugbreeder.vscode-readhub原文链接&#xff1a;https://github.com/alex-yh99/vscode-readhub/blob/master/docs/develop-note.md一、关于插件在 VSCode 中快捷查阅科技动态、开发者资讯等 Readhub …

9月数据库排行:Microsoft SQL Server分数罕见下滑

DB-Engines 数据库流行度排行榜 9 月更新已发布&#xff0c;排名前二十如下&#xff1a;明显能看出来&#xff0c;整体排名和上个月的保持一致。而上个月出现分数下跌的 PostgreSQL 和 MongoDB 终于“回归正道”&#xff0c;分数有了稍微的上升。与上个月相比&#xff0c;Postg…

Exceptionless使用介绍

一.Exceptionless介绍Exceptionless专注于.net平台提供实时错误和日志报告。主要包括&#xff1a;错误通知、智能分组异常、详细错误报告堆栈跟踪、支持离线、UI查看重要错误和确定优先级、仪表板上的统计信息和趋势、对异常标记为已修复&#xff0c;监视回归、将事件标记为关键…

Net Core DocXCore 实现word模板导出

实际工作中&#xff0c;往往有这样的需求&#xff0c;需要导出word&#xff0c;还有各种各样的样式&#xff0c;于是有了word模板导出。实现以下几个需求&#xff1a;1、表单导出2、表格导出3、表单表格混合导出4、实际用例测试解决方案&#xff1a;实现是基于NET Core 2.1 &am…

密钥分离,.Net程序猿不再背锅

引言互联网每隔一段时间就会爆出 【某程序猿在代码托管平台上传了公司机密配置信息&#xff0c;导致公司核心数据被黑客获取或修改】&#xff0c; 一茬又一茬背锅侠层出不穷。拯救自我软件工程理论早以加粗字体给出 经典原则&#xff1a;Never store production passwords or o…

Chrome让人失望,是时候转到Firefox或Edge?

我们曾报道过谷歌正在移除 Chrome 的关闭其他选项卡&#xff0c;这引起很多用户的讨论&#xff0c;很多用户表现出对 Chrome 浏览器的失望。而在国外&#xff0c;也有很多人认为谷歌这项修改使 Chrome 变得越来越臃肿。还有前段时间&#xff0c;谷歌在 Chrome 76 中隐藏了 “ht…

我认真写下9段如翔一般的代码,只为等你来品鉴

溪源 | 长沙.NET技术社区开篇我们总是很容易就能写出满足某个特定功能的代码&#xff0c;却很难写出优雅代码。又最欣赏那些优雅的代码&#xff0c;因为优雅代码更能体现一个开发者的积累。就像写一篇散文&#xff0c;有的就像初学者不得其门而入&#xff0c;遣词造句都非常困难…

「标签管理」用数据管理思维去管理你的日常电子化资料、文件、笔记等

最近一时兴起&#xff0c;研究了一些文件管理的方法论和笔记管理类的知识&#xff0c;自己想到一些不错的方法及落地方案&#xff0c;可能对一部分朋友来说&#xff0c;这些方法和工具的落地会有一些共鸣&#xff0c;故简单给大家做一下分享。跨界应用&#xff1a;数据表结构应…

Java之JMS

一&#xff1a;JMS简介   JMS即Java消息服务&#xff08;Java Message Service&#xff09;&#xff0c;是一个Java平台定义的关于面向消息中间件的API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。JMS是一个与具体平台无…

程序员过关斩将--更加优雅的Token认证方式JWT

点击上方“蓝字”带你去看小星星菜菜&#xff0c;上次你讲的cookie和session认证方式&#xff0c;我这次面试果然遇到了结果怎么样&#xff1f;结果面试官问我还有没有更好的方式&#xff1f;看来你又挂了别说了&#xff0c;伤心呀。到底还有没有更好的方式呢&#xff1f;你猜&…

Java之JMX

JMX&#xff0c;即Java Management Extensions&#xff0c;Java管理扩展。是一个为应用程序、设备、系统等植入管理功能的框架。   JMX提供了一种简单、基础的方法&#xff0c;用来管理应用、设置、服务等资源。由于JMX是动态的&#xff0c;你可以使用JMX技术来监控和管理处于…

[NewLife.XCode]分表分库(百亿级大数据存储)

NewLife.XCode是一个有15年历史的开源数据中间件&#xff0c;支持netcore/net45/net40&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xf…

你的技术债还了吗?

什么是技术债&#xff1f;技术债是由沃德坎宁安在1992年提出&#xff0c;指我们在软件架构或代码编写过程中有意无意地做了错误的决策。随着时间的累积&#xff0c;这种错误会越来越多&#xff0c;就像背负了很多债务一样。技术债的危害技术债同财务债一样&#xff0c;是有利息…

拿 C# 搞函数式编程

最近闲下来了&#xff0c;准备出一个 C# 搞 FP 的合集。本合集所有代码均以 C# 8 为示例。可能你说&#xff0c;为什么要这么做呢&#xff1f;回答&#xff1a;为了好玩。另外&#xff0c;意义党们请 gun cu ke&#xff01;C# 有委托&#xff0c;而且有 Func<> 和 Action…

CNCF发布K8s项目历程报告,35k贡献者有你吗?

云原生计算基金会 CNCF 首次发布了 Kubernetes 项目历程报告。Kubernetes 托管于 CNCF&#xff0c;它是目前使用最广泛的容器编排平台&#xff0c;通常被称为“云端 Linux”&#xff0c;CNCF 介绍此报告旨在客观地评估 Kubernetes 项目的状态以及 CNCF 如何影响 Kubernetes 的发…

API 和 SPI

简介&#xff1a; API&#xff1a;Application Programming Interface应用程序接口 SPI&#xff1a;Service Provider Interface服务商提供接口 JDK中有描述&#xff0c; the API is the description of classes/interfaces/methods/… that you call and use to achieve a go…

编程语言这一年

最近开源中国&#xff08;OSCHINA&#xff09;在庆祝 11 周年生日&#xff0c;编辑部借着这个机会梳理了一下这一年来我们追过的那些开源界/开发界的热点新闻&#xff0c;算作一个阶段性小结。&#xff08;其实只有 9 个月&#xff5e;&#xff09;开源中国是目前国内为数不多深…

使用Elastic APM监控你的.NET Core应用

前言在应用实际的运维过程中&#xff0c;我们需要更多的日志和监控来让我们对自己的应用程序的运行状况有一个全方位的了解。然而对于大部分开发者而言&#xff0c;平时大家所关注的更多的是如何更优雅的实现业务&#xff0c;或者是如何让应用的响应速度更快等等与编码相关的技…