上下文(Aegis.Context)
Aegis.Context 提供请求级运行时上下文访问能力。当前公开的核心入口是 ActionContext.Current,用于读取当前请求的请求标识、客户端信息和可透传请求头。
组件概览
| 字段 | 说明 |
|---|---|
| 组件名称 | 上下文 |
| 真实类库 | Aegis.Context |
| 组件定位 | 请求级运行时上下文访问 |
| 引入方式 | 安装 NuGet,并通过 Aegis 默认请求管线自动填充 |
| 组件声明 | 无 |
| 核心类型 | ActionContext |
| 依赖关系 | 通常配合 Aegis.Core.Infrastructure 使用 |
这一个组件到底提供什么
当前 Aegis.Context 对外提供的是请求元信息,不是完整的用户会话框架。
ActionContext.Current 里目前重点有这些字段:
RequestIdUserAgentIpAddressHeaders
如果你要读取当前登录用户、权限或令牌信息,那是认证与鉴权组件的职责,不是 Aegis.Context 本身的职责。
最小可用方式
只要请求已经进入 Aegis 的默认请求管线,就可以直接读取:
var requestId = ActionContext.Current.RequestId;
var userAgent = ActionContext.Current.UserAgent;
var ipAddress = ActionContext.Current.IpAddress;
var headers = ActionContext.Current.Headers;
最常见的使用场景
在控制器或服务中读取请求标识
var requestId = ActionContext.Current.RequestId;
Console.WriteLine(requestId);
这类用法适合:
- 打印业务日志
- 透传链路请求标识
- 排查跨服务请求
读取请求头里的业务上下文
Headers 里保存的是经过过滤后的可用请求头字典。
if (ActionContext.Current.Headers.TryGetValue("X-Tenant-Id", out var tenantId))
{
Console.WriteLine(tenantId);
}
适合场景:
- 租户标识透传
- 医院编码、机构编码透传
- 业务自定义 Header 透传
读取客户端来源信息
var ipAddress = ActionContext.Current.IpAddress;
var userAgent = ActionContext.Current.UserAgent;
适合场景:
- 请求审计
- 安全审查
- 问题定位
它是怎么被填充的
ActionContext.Current 不是你手动创建的,而是在 Aegis 默认请求管线里自动写入。
可以这样理解:
- 请求进入应用
- 基础设施中间件生成或接收
X-Request-Id - 基础设施中间件提取请求头、客户端 IP、User-Agent
- 把这些信息写入
ActionContext.Current
所以这一个组件通常要和 基础设施(Aegis.Core.Infrastructure) 配合看。
使用时要注意什么
它只在请求上下文里稳定可用
如果当前代码不在 HTTP 请求链路内,例如:
- 应用启动初始化器
- 某些后台任务
- 独立控制台流程
就不要默认认为 ActionContext.Current 一定有值。
它不是当前用户上下文
当前 ActionContext 公开的数据重点是请求元信息,不直接等同于:
- 当前用户身份
- 当前角色权限
- 当前令牌对象
如果你需要这些能力,应该继续看认证与鉴权组件。
不要把它当长期存储
ActionContext.Current 适合请求期间读取,不适合当作跨请求缓存或业务状态存储。
接入完成后怎么确认成功
你至少应该确认这些点:
- 应用是通过 Aegis 默认启动方式运行的
- 请求进入控制器时可以读到
ActionContext.Current RequestId能稳定透传- 自定义业务 Header 能在
Headers里读到 - 非请求场景不会误把
ActionContext.Current当作必有值