为 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】,邀你加入技术交流

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

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

相关文章

图片压缩上传Thumbnailator 插件

假如你现在还在为自己的技术担忧&#xff0c;假如你现在想提升自己的工资&#xff0c;假如你想在职场上获得更多的话语权&#xff0c;假如你想顺利的度过35岁这个魔咒&#xff0c;假如你想体验BAT的工作环境&#xff0c;那么现在请我们一起开启提升技术之旅吧&#xff0c;详情请…

jQuery实现登录提示

实现效果&#xff1a;将鼠标聚焦到邮箱地址文本框时&#xff0c;文本框 内的“请输入邮箱地址”文字将被清除&#xff1b; 若没有输入任何内容&#xff0c;鼠标移除后邮箱地址文本框被还原。 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"…

C语言试题七十之请编写函数判断年份是否为闰年

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

js 通过jquery插件获取url参数 其中的一个小问题,或许不算Bug。

形如&#xff1a;http://localhost:10864/srch.htm?keys&type1 这样的地址&#xff0c;如果我们要取keys的参数&#xff1a; var srchKey $.query.get("keys"); 那么得到的将是‘true’ &#xff0c;而不是空客串&#xff0c;这常常不是我们想要的 。 修正办法…

【Pix4d精品教程】未校准相机:287 out of 402 images calibrated (71%), all images enabled, 6 block,问题分析及解决方案汇总

文章目录 问题描述原因分析问题分析问题解决问题描述 在使用pix4d处理航测数据时,部分航带高精度检测时,提示未校准相机: 287 out of 402 images calibrated (71%), all images enabled, 6 blocks 质量报告如下所示: 切换到【控三射线】,查看空山射线,红色部分是校准失败…

设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code

程序代码实现启用或禁用Windows 8.1 Tablet的自己主动旋转功能 方法一&#xff1a;使用SetDisplayAutoRotationPreferences函数功能 #include <Windows.h>/* typedef enum ORIENTATION_PREFERENCE { ORIENTATION_PREFERENCE_NONE 0x0, ORIENTATION_PRE…

四、函数修改器《2022 solidity8.+ 版本教程到实战》

一、函数修改器 modifier 在 solidity 中有一个函数修改器可作为前置、中置或者后置方法&#xff0c;有点像 ASP.NET 中的母版页&#xff08;最起码差不多十年不碰了&#xff0c;不懂还有没有这个概念&#xff09;&#xff0c;又有点像 ThinkPHP 中的前置方法&#xff0c;可以…

C#-基于ip2region的离线IP定位库

前言在开发中&#xff0c;我们需要记录关于登录者的ip和位置信息&#xff0c;可以通过ip2region来实现&#xff01;比如说:qq&#xff0c;gitee等 我们在异地登录时&#xff0c;会提醒我们账号异地登录&#xff01;外卖等软件&#xff0c;需要地理位置&#xff0c;如果我们的gp…

【No.7 C++对象的构造与析构时间】

【注意】 程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具&#xff0c;可以并鼓励深入掌握一门语言&#xff0c;但千万别沉迷于钻某种语言的牛角尖&#xff0c;一定要把握好二者间的度本帖属不定时连载贴&#xff0c;以试卷的形式提出一个比较基础的问题供大家…

mysql按月进行表分区

数据库 mysql 单表数据量达到千万、亿级&#xff0c;可以通过分表与表分区提升服务性能。 现有表accounting&#xff0c;4亿条数据&#xff0c;数据访问方式为insert与select&#xff0c;select为按月访问&#xff0c;为减少数据与程序变更&#xff0c;采用表分区的方式。 数据…

C语言试题七十一之请编写函数求出这个数的阶乘

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

MFC 直线 虚线 折线 圆 椭圆 矩形 弧形

****Dlg.h头文件加入&#xff1a; //为project加入画笔、点变量数组 public:CPen m_pen[5];CPoint m_point[5]; public:void DrawLine(CDC *pDC);void DrawPolyline(CDC *pDC);void DrawPolygon(CDC *pDC);void DrawRect(CDC *pDC);void DrawRoundRect(CDC *pDC);void DrawElli…

最近无埋点技术很是流行,抽空研究了下诸葛IO,talkingData以及百分点这些业内知名公司的无埋点SDK,抽取其中重要的信息供大家参考:

1、首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而是脱离代码&#xff0c;只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码&#xff0c;而是尽可能的少写代码。开发者将S…

【Pix4d精品教程】pix4d mapper相机未校准后手动添加连接点完美案例图文教程

pix4d mapper相机未校准后手动添加连接点完美案例图文教程 整体预览 局部放大 如图所示,红色的照片为未校准的图片,软件无法自动获取连接点,有关相机未校准的原因及解决办法,可以参考《pix4d未校准相机:287 out of 402 images calibrated (71%), all images enabled, 6 bl…

五、构造函数《2022 solidity8.+ 版本教程到实战》

一、构造函数 构造函数存在于很多语言中&#xff0c;可用于对当前对象在第一次创建时的初始化设置。在 solidity 合约中&#xff0c;也存在对应的构造函数&#xff0c;使用 constructor(){} 对其进行定义。 以下在合约中创建一个最简单的构造函数代码&#xff1a; // SPDX-L…

Blazor University (30)表单 —— 从 InputBase 派生

原文链接&#xff1a;https://blazor-university.com/forms/descending-from-inputbase/从 InputBase 派生源代码[1]InputBase<T> 组件是各种 Blazor 输入控件所继承的抽象类。这个类在标准 HTML <input> 元素的基础上增加了额外的功能&#xff0c;比如验证——我们…

3.菜鸟教你一步一步开发 web service 之 axis 服务端创建

转自&#xff1a;https://blog.csdn.net/shfqbluestone/article/details/37610601 第一步&#xff0c;新建一个工程&#xff0c;如图&#xff1a; 选 Java 写一个工程名&#xff0c;选择好工程路径&#xff0c;点下一步 选择 webServices &#xff0c;在右边的 version 中选择 …

C语言试题七十二之请编写函数判断三角形的类型,并输出其面积和类型。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

ArcGIS实验教程——实验三十四:ArcGIS地统计分析全解(直方图、正态QQ图、趋势分析、voronoi图、半变异函数、协方差云)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 一、地统计分析的基本原理二、地统计分析的工作流程三、探索性空间数据分析工具1. 直方图2. QQ分布图3. 趋势分析4. Voronoi图5. 半变异函数与协方差云6. 交叉协方差云四、空间插值一、地…

四则运算

四则运算的生成代码&#xff08;C语言&#xff09; 学生&#xff1a;徐克 夏嘉晖 1 #include<stdio.h> 2 #include<stdlib.h> 3 main() 4 { 5 int a[50]; 6 int b[50]; 7 int num,count,i; 8 printf("1.加法\n"); 9 printf("2.减法…