Middleware (7) — HeaderPropagation

Feng Gao
4 min readOct 3, 2021

1. Introduction

Header Propagation 顾名思义就是将请求的 Header 进行传递,整个流程大致如下:

服务在接收到请求之后,会交给中间件处理,中间件会记录下原先请求(inbound)的 Header ,如果说这个请求需要访问别的服务以获得资源,那么可以将 inbound 请求的 Header 添加 outbound 请求的 Header 中。通常转发的情况分为三种:

  1. 直接转换 Header : 比如说上述示例中, X-Feature: Test 被直接转发
  2. 转换 Header 的名称: 在获取 X-Feature 之后,可能将这个 Header 修改为 X-Feature-Internal: Test
  3. 创建一个完全不同的 Header : 也就是说在后续的请求 Header中 可能是这样的 X-Feature-Internal: demo

2 HeaderPropagationOptions

HeaderPropagationOptions 只包含了一个 HeaderPropagationEntryCollection 类型的属性,该类型是 HeaderPropagationEntry 的集合,该类型包含下面三个属性

该类型代表了在 Middleware 中需要关注的 Header

  • InboundHeaderName 原始请求的需要传递的 Header 名称;
  • CapturedHeaderName 需要将它转换的 Header 的名称;
  • ValueFilter 可以将 Header 的修改的委托。

3 HeaderPropagationMessageHandlerOptions

该类主要用在 HttpClientMessageHandler 中,在 SendAsync 方法中,在 HttpRequestMessage 中添加相关的 Header

同样 HeaderPropagationMessageHandlerEntryCollectionHeaderPropagationHandlerEntry 的集合

该类型只有两个属性: 1) CaptureHeaderNameHeaderPropagationEntryCaptureHeaderName ;2) OutboundHeaderName 是转换的请求, Header 的名称。

4 HeaderPropagationValue

这是一个字典,存储了因为 HeaderPropagation 的中间数据

采用 AsyncLocal 可以保存这个类型在多线程中也是安全的,其中字典的 KeyCaptureHeaderName ,它是衔接 HeaderPropagationEntryHeaderPropagationMessageHandlerEntry

5. HeaderPropagationMiddleware

整个过程非常 StraightForward , 依次迭代 HeaderPropagationEntryCollection 对象,从请求的 Header 中获取值,并且添加到 HeaderPropagationValue 中。

6 HeaderPropagationMessageHandler

HeaderPropagationMessageHandler 会在构建 HttpClient 的时候,创建这个 MessageHandler 。不过要注意下面几点

  1. 首先是迭代 HeaderPropagationMessageHandlerEntryCollection 对象,因为它是一个集合,迭代时候没有内存分配;还有通常情况下,这个数据量比较小;
  2. 如果请求中已经有了这个 outboundHeaderName , 则不需要添加 header

7 Sample

--

--

Feng Gao

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready