.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
相关产品推荐
相关产品推荐

