西安建站模板,数码印花图案设计网站,企业信息信用信息公示网官网,htm网站模板前言我们常用 JWT 令牌用于身份验证#xff0c;前端一般是在请求中包含 HTTP 标头 Authorization 实现。但是#xff0c;当服务间需要互相调用时#xff0c;也需要按原样将标头传播到目标服务。原来的解决方案是从请求中读取标头#xff0c;并将其添加到对外请… 前言我们常用 JWT 令牌用于身份验证前端一般是在请求中包含 HTTP 标头 Authorization 实现。但是当服务间需要互相调用时也需要按原样将标头传播到目标服务。原来的解决方案是从请求中读取标头并将其添加到对外请求标头集合中。后来发现微软已经考虑了这种场景并提供了专门的中间件来解决这个需求。Demo下面我们创建 ServerA、ServiceB 两个 Web API 项目来演示这一功能。首先ServiceB 有一个 GET 方法返回在请求中收到的所有标头这使我们能够验证标头是否被传播[HttpGet]
public IHeaderDictionary Get()
{return Request.Headers;
}执行 ServiceB 的 GET 请求我们可以类似下图的响应现在用 ServiceA 调用 ServiceB 并返回响应。这将向我们显示哪些标头传播到 ServiceB[HttpGet]
public async Taskstring Get()
{var client _clientFactory.CreateClient(ServiceB-Client);var response await client.GetAsync(/ServiceB);return await response.Content.ReadAsStringAsync();
}执行 ServerA 的 GET 请求可以看到Authorization 标头并没有被传播这时我们可以引用 Nuget 包 Microsoft.AspNetCore.HeaderPropagation并且修改 Startup.cs 启用标头传播功能public void ConfigureServices(IServiceCollection services)
{// 定义需要传播的标头services.AddHeaderPropagation(options options.Headers.Add(Authorization));services.AddHttpClient(ServiceB-Client, options options.BaseAddress new Uri(http://localhost:57516))// 定义开启标头传播.AddHeaderPropagation();......
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{// 添加标头传播middlewareapp.UseHeaderPropagation();......
}再次执行 ServerA 的 GET 请求可以看到Authorization 标头被正确传播了结论标头传播中间件允许我们轻松地将标头从一个请求传播到另一个请求。可用于下列场景授权令牌语言选择分布式跟踪请求链浏览器信息其他自定义信息想了解更多内容请关注我的个人公众号”My IO“