.NET Minimal API中如何将中间件上下文传递至后续链路
如何将中间件中的上下文数据传递到后续的MapPost方法中?
我需要把app.Use中间件里获取到的远程IP地址传递到后面的/test Post接口方法中,请问该怎么做?
原代码
app.Use(async (context, next) => { using (LogContext.PushProperty("FILE", "Program.cs")) using (LogContext.PushProperty("METHOD", "app.Use()")) { IPAddress remoteIp; if (context.Connection.RemoteIpAddress == null) remoteIp = IPAddress.Parse("::1").MapToIPv6(); else remoteIp = context.Connection.RemoteIpAddress.MapToIPv6(); logger.Information("Request from Remote IP address: {RemoteIP}", remoteIp); if (IpWhitelist.ipWhitelist == null) { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; return; } if (!IpWhitelist.ipWhitelist.ContainsKey(remoteIp.ToString()) && !IpWhitelist.ipWhitelist.ContainsKey(remoteIp.MapToIPv6().ToString())) { logger.Information("Forbidden Request from Remote IP address: {IP}", remoteIp); context.Response.StatusCode = (int)HttpStatusCode.Forbidden; return; } } await next.Invoke(context); }); app.MapPost("/test", async (Request request)=> { });
解决方案
方法一:利用HttpContext.Items传递数据
HttpContext.Items是请求生命周期内的临时存储容器,专门用于在中间件和后续请求处理逻辑之间传递数据。
- 修改中间件,将获取到的IP存入
Items:
app.Use(async (context, next) => { using (LogContext.PushProperty("FILE", "Program.cs")) using (LogContext.PushProperty("METHOD", "app.Use()")) { IPAddress remoteIp; if (context.Connection.RemoteIpAddress == null) remoteIp = IPAddress.Parse("::1").MapToIPv6(); else remoteIp = context.Connection.RemoteIpAddress.MapToIPv6(); // 将IP存入HttpContext.Items context.Items["RemoteIpAddress"] = remoteIp; logger.Information("Request from Remote IP address: {RemoteIP}", remoteIp); // 原有的白名单校验逻辑... } await next.Invoke(context); });
- 在
MapPost方法中注入HttpContext并读取数据:
app.MapPost("/test", async (Request request, HttpContext context)=> { // 从Items中取出IP if (context.Items.TryGetValue("RemoteIpAddress", out var remoteIpObj) && remoteIpObj is IPAddress remoteIp) { // 在这里使用远程IP地址 logger.Information("Received request from IP: {RemoteIP}", remoteIp); } // 其他业务逻辑... });
方法二:直接从HttpContext获取IP(更简洁)
如果你只是需要获取远程IP地址,其实不需要在中间件中提前存储,直接在MapPost方法里通过HttpContext读取即可,还可以封装成扩展方法简化调用:
- 编写扩展方法:
public static class HttpContextExtensions { public static IPAddress GetRemoteIpAddress(this HttpContext context) { if (context.Connection.RemoteIpAddress == null) return IPAddress.Parse("::1").MapToIPv6(); return context.Connection.RemoteIpAddress.MapToIPv6(); } }
- 在
MapPost中直接调用:
app.MapPost("/test", async (Request request, HttpContext context)=> { var remoteIp = context.GetRemoteIpAddress(); // 使用IP地址 logger.Information("Request IP: {RemoteIP}", remoteIp); });
场景说明
- 如果需要传递中间件处理后的额外数据(比如白名单校验后的标记),优先用
HttpContext.Items方法。 - 如果只是需要获取远程IP这类本身就存在于
HttpContext中的数据,直接用扩展方法更高效,避免多余的存储操作。
内容的提问来源于stack exchange,提问作者TriedAtLeast
相关产品推荐
相关产品推荐

