上下文(Aegis.Context)
解决什么问题
业务代码经常需要访问当前请求的元信息(请求标识、客户端 IP、业务请求头等),但服务层无法直接访问 HttpContext,手动传递又很繁琐。
Aegis.Context 通过 ActionContext.Current 提供一个请求级的静态入口,在任何层都能直接访问当前请求的元信息,不需要通过参数传递。
如何引入
不需要单独安装或注册。Aegis.Context 是 Aegis.Core.Infrastructure 的传递依赖,只要项目接入了 基础设施组件,ActionContext.Current 就会自动可用。
ActionContext 的字段
| 字段 | 类型 | 说明 |
|---|---|---|
RequestId | string | 当前请求的唯一标识。来自 X-Request-Id 请求头,如果请求没有携带则自动生成 |
UserAgent | string | 客户端的 User-Agent |
IpAddress | string | 客户端 IP 地址,会自动处理 X-Forwarded-For 代理头 |
Headers | ImmutableDictionary<string, string> | 业务自定义请求头字典(标准 HTTP 头已被过滤) |
使用方式
直接通过 ActionContext.Current 读取,不需要注入任何服务:
using Aegis.Context;
// 读取请求标识
var requestId = ActionContext.Current.RequestId;
// 读取客户端信息
var ip = ActionContext.Current.IpAddress;
var ua = ActionContext.Current.UserAgent;
// 读取业务请求头
if (ActionContext.Current.Headers.TryGetValue("X-Tenant-Id", out var tenantId))
{
// 使用租户标识
}
常见场景
- 日志补充请求标识:把
RequestId写入日志,方便跨服务排查问题 - 租户/机构标识透传:从请求头中读取业务标识(
X-Tenant-Id、X-Hospital-Code等) - 安全审计:记录请求来源 IP 和 User-Agent
- 链路追踪:
RequestId会自动透传到通过Aegis.Net.Broker发起的下游 HTTP 调用,不需要手动传递
关于 Headers 字典
Headers 里过滤掉了 Accept、Content-Type、Host、Origin 等标准 HTTP 头,只保留业务自定义请求头。X-Request-Id 和 User-Agent 也已单独提取到对应字段,不会出现在 Headers 中。
边界与限制
只在 HTTP 请求链路内可用
ActionContext.Current 在以下场景中为 null,使用前应做空值检查:
- 应用启动时的初始化代码
- 后台定时任务(
IHostedService/Aegis.Jobs) - 独立控制台程序
var requestId = ActionContext.Current?.RequestId;
不是用户身份上下文
ActionContext 只提供请求元信息,不包含当前登录用户、角色、权限或令牌信息。这些由 认证与鉴权组件 提供。
不适合做跨请求存储
ActionContext.Current 的生命周期和请求一致,请求结束即释放。