为 HttpClient 注册自定义请求标头

2023-10-23 21:40

本文主要是介绍为 HttpClient 注册自定义请求标头,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

上次,我们介绍了《在 ASP.NET Core 中使用 HTTP 标头传播》。

但是有时候,当服务间需要互相调用时,也需要将创建一些自定义标头传播到目标服务。

比如, ServiceA 已经进行了身份验证,那么当它调用 ServiceB 时,不需要传播 HTTP 标头 Authorization,可以自定义 x-user-id 标头, 直接告诉 ServiceB 当前用户 ID。

1. 使用 HttpRequestMessage

最简单的方法,创建 HttpRequestMessage 实例直接添加标头。

ServiceA 的实现代码如下:

[HttpGet]
public async Task<string> Get()
{var userId = GetUserId();//从认证信息中获取var request = new HttpRequestMessage(HttpMethod.Get, "/ServiceB");if (!string.IsNullOrWhiteSpace(userId)){request.Headers.Add("x-user-id", userId);}var client = _clientFactory.CreateClient("ServiceB-Client");var response =  await client.SendAsync(request);return await response.Content.ReadAsStringAsync();
}

但是,这种解决方案存在一个问题:

  • 如果有多个调用其他服务的方法,我们需要重复相同的逻辑;

2.使用 DelegatingHandler

在 ASP.NET Core 中,我们经常会使用 Middleware, 它使用管道模式,可以对服务收到的请求进行处理:

d96c7c878f6841150bc29ade369f9a00.png

DelegatingHandler 提供了几乎相同的概念,但却是在 HttpClient 发出传出请求时。

实现代码如下:

public class UserIdDelegatingHandler : DelegatingHandler
{protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){var userId = GetUserId();//从认证信息中获取if (!string.IsNullOrWhiteSpace(userId) && !request.Headers.Contains("x-user-id")){request.Headers.TryAddWithoutValidation(Headers.CorrelationId, userId);}return await base.SendAsync(request, cancellationToken);}
}

然后修改 Startup.cs,注册 UserIdDelegatingHandler:

public void ConfigureServices(IServiceCollection services)
{services.AddHttpClient("ServiceB-Client", options => options.BaseAddress = new Uri("http://localhost:57516")).AddHttpMessageHandler<UserIdDelegatingHandler>()......
}

现在,我们可以从调用服务的代码中删除有关注册自定义标头的所有代码:

[HttpGet]
public async Task<string> Get()
{var client = _clientFactory.CreateClient("ServiceB-Client");var response =  await client.GetAsync("/ServiceB");return await response.Content.ReadAsStringAsync();
}

结论

如果我们想向 HttpClient 添加任何标头,无需修改业务代码,只需调用 .AddHttpMessageHandler 注册新的 DelegatingHandler 即可。

添加微信号【MyIO666】,邀你加入技术交流

这篇关于为 HttpClient 注册自定义请求标头的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/270620

相关文章

Eureka高可用注册中心registered-replicas没有分布式注册中心

自己在学习过程中发现,如果Eureka挂掉了,其他的Client就跑不起来了,那既然是商业项目,还是要处理好这个问题,所以决定用《Spring Cloud微服务实战》(PDF版在全栈技术交流群中自行获取)中说的“高可用注册中心”。 一开始我yml的配置是这样的 server:port: 8761eureka:instance:hostname: 127.0.0.1client:fetch-r

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

axios全局封装AbortController取消重复请求

为什么? 问题:为什么axios要配置AbortController?防抖节流不行吗? 分析: 防抖节流本质上是用延时器来操作请求的。防抖是判断延时器是否存在,如果存在,清除延时器,重新开启一个延时器,只执行最后一次请求。节流呢,是判断延时器是否存在,如果存在,直接return掉,直到执行完这个延时器。事实上,这些体验感都不算友好,因为对于用户来说,得等一些时间,尤其是首次请求,不是那么流畅

添加自定义的CALayer

iOS开发UI篇—CAlayer(创建图层) 一、添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控制器view的layer上)  1 // 2 // YYViewController.m 3 // 01-创建一个简单的图层 4 // 5 //

android自定义View的和FramgentActivity的一个小坑

对于自定义View //加载样式TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBarView, defStyleAttr, 0);setTitle(typedArray.getString(R.styleable.TitleBarView_main_title));//不能写成

第三十七章 添加和使用自定义标题元素 - 自定义标头的继承

文章目录 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承自定义标头的继承示例 在 `SOAPHEADERS` 参数中指定支持的标头元素自定义标头的继承 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承 自定义标头的继承 如果创建此Web 服务的子类,该子类将继承不特定于方法的标头信息 — 包含在 <request> 或 <response> 元素中的标头信

jmeter测试https请求

公司最近在搞全站HTTPS改造,进一步提高网站的安全性,防止运营商劫持。那么,改造完成后,所有前后端的URL将全部为https。 So ,研究下怎么用Jmeter访问https请求呢。 其实很简单, 第一步在jmeter中创建HTTP请求,如下图进行配置,https端口为443; 第二步,在本机浏览器,如Chrome中导入该域名证书,在更多工具-设置-管理证书的地方,找到该证书,导出到本地。然后在

关于IE get 请求报400

问题描述: 在使用IE8进行get请求时,参数中有中文存在,发现发送请求之后,返回http状态码400 问题解决方法: 把请求连接进行处理window.encodeURI('http://aaa:8080/wtp?name=小明'); window.location.href=window.encodeURI('http://aaa:8080/wtp?name=小明'); 然后在把处理后

自定义recyclerView实现时光轴效果

时光轴效果在很多app上都有出现,例如淘宝中快递的跟踪,本文将使用recyclerView实现时光轴效果,我们会到自定义控件,首先先看一下效果图: 接下来是步骤分析 1自定义属性 这个大家应该都了解了,根据我们之前的分析,直接在attrs.xml中进行声明 <declare-styleable name="TimeLine"><attr name="beginLine" f

删除第三方AAR所请求的权限

1.问题:引了第三方的AAR库要求一些权限,但我APP不需要,我想删除掉,怎么办 答:很简单,只要在添加:http://schemas.android.com/tools 这个工具在manifest文件中,然后在相应的权限上增加:tools:node="remove"即可。 <manifest xmlns:android="http://schemas.android.com/apk/res/a