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

.NET Minimal API过滤器中如何获取当前端点名称?

从EndpointFilterInvocationContext获取Minimal API端点名称的解决方案

要在FeatureFlagEndpoint过滤器中直接获取当前端点的名称,无需手动传入参数,核心思路是读取端点元数据中由.WithName()配置的EndpointNameAttribute属性值。具体实现步骤如下:

修改扩展方法

移除扩展方法的参数,直接注册过滤器即可:

public static class FeatureFlagFilterEndpointExtensions
{
    public static TBuilder AddFeatureFlag<TBuilder>(this TBuilder builder) 
        where TBuilder : IEndpointConventionBuilder
    {
        builder.AddEndpointFilter<FeatureFlagEndpoint>();
        return builder;
    }
}

重构FeatureFlagEndpoint过滤器

去掉构造函数的端点名称参数,在InvokeAsync方法中从上下文提取端点名称:

public class FeatureFlagEndpoint : IEndpointFilter
{
    public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next)
    {
        var featureManager = context.HttpContext.RequestServices.GetRequiredService<IFeatureManager>();
        
        // 获取当前匹配的端点
        var endpoint = context.HttpContext.GetEndpoint();
        if (endpoint == null)
        {
            return Results.NotFound();
        }
        
        // 从端点元数据中提取EndpointNameAttribute
        var endpointNameAttr = endpoint.Metadata.GetMetadata<EndpointNameAttribute>();
        if (endpointNameAttr == null)
        {
            // 可根据业务需求调整:比如返回错误、跳过特性校验等
            return Results.BadRequest("端点未配置名称");
        }

        var endpointName = endpointNameAttr.EndpointName;
        
        // 执行特性标志校验逻辑
        var isFeatureEnabled = await featureManager.IsEnabledAsync(endpointName);
        if (!isFeatureEnabled)
        {
            return Results.StatusCode(StatusCodes.Status403Forbidden);
        }

        return await next(context);
    }
}

更新端点定义

现在调用AddFeatureFlag时无需传入参数,只需确保端点通过.WithName()配置了名称:

app.MapGet("/newweatherforecast", () =>
{
    var forecast = Enumerable.Range(1, 10).Select(index =>
        new WeatherForecastNew
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55)
        ))
        .ToArray();
    return forecast;
})
.AddFeatureFlag()
.WithName("NewGetWeatherForecast")
.WithOpenApi();

注意事项

  • 必须为端点配置.WithName(),否则无法提取到端点名称,可根据业务场景调整空值处理逻辑;
  • context.HttpContext.GetEndpoint()在EndpointFilter的执行阶段是可靠的,因为过滤器是在端点匹配完成后执行的,不会返回null。

内容的提问来源于stack exchange,提问作者Hardipsinh Jadeja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:33:50