跳到主要内容
版本:3.0.0

上下文(Aegis.Context)

解决什么问题

业务代码经常需要访问当前请求的元信息(请求标识、客户端 IP、业务请求头等),但服务层无法直接访问 HttpContext,手动传递又很繁琐。

Aegis.Context 通过 ActionContext.Current 提供一个请求级的静态入口,在任何层都能直接访问当前请求的元信息,不需要通过参数传递。

如何引入

不需要单独安装或注册。Aegis.ContextAegis.Core.Infrastructure 的传递依赖,只要项目接入了 基础设施组件ActionContext.Current 就会自动可用。

ActionContext 的字段

字段类型说明
RequestIdstring当前请求的唯一标识。来自 X-Request-Id 请求头,如果请求没有携带则自动生成
UserAgentstring客户端的 User-Agent
IpAddressstring客户端 IP 地址,会自动处理 X-Forwarded-For 代理头
HeadersImmutableDictionary<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-IdX-Hospital-Code 等)
  • 安全审计:记录请求来源 IP 和 User-Agent
  • 链路追踪RequestId 会自动透传到通过 Aegis.Net.Broker 发起的下游 HTTP 调用,不需要手动传递

关于 Headers 字典

Headers 里过滤掉了 AcceptContent-TypeHostOrigin 等标准 HTTP 头,只保留业务自定义请求头。X-Request-IdUser-Agent 也已单独提取到对应字段,不会出现在 Headers 中。

边界与限制

只在 HTTP 请求链路内可用

ActionContext.Current 在以下场景中为 null,使用前应做空值检查:

  • 应用启动时的初始化代码
  • 后台定时任务(IHostedService / Aegis.Jobs
  • 独立控制台程序
var requestId = ActionContext.Current?.RequestId;

不是用户身份上下文

ActionContext 只提供请求元信息,不包含当前登录用户、角色、权限或令牌信息。这些由 认证与鉴权组件 提供。

不适合做跨请求存储

ActionContext.Current 的生命周期和请求一致,请求结束即释放。