You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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是请求生命周期内的临时存储容器,专门用于在中间件和后续请求处理逻辑之间传递数据。

  1. 修改中间件,将获取到的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);
});
  1. 在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读取即可,还可以封装成扩展方法简化调用:

  1. 编写扩展方法:
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();
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:05:24