.NET Core 6自定义IContextualFeatureFilter未执行,IsEnabledAsync恒为false
问题分析与解决方案
核心问题:配置格式错误导致过滤器未加载
你的自定义过滤器未执行、IsEnabledAsync始终返回false的关键原因是appsettings.json中EnabledFor的格式不符合框架要求。.NET Feature Management规定EnabledFor必须是过滤器数组(哪怕只有一个过滤器),而非单个对象。当前配置的写法会让框架无法识别并加载PhaseFilter,最终默认返回false。
修复步骤
1. 修正appsettings.json配置
把EnabledFor改为数组格式:
"FeatureManagement": { "ShowLearningGoalsToCourseDirectors": { "EnabledFor": [ { "Name": "PhaseFilter", "Parameters": { "AllowedPhases": "FCC" } } ] } }
2. 优化过滤器参数绑定(可选)
你当前用GetSection获取参数,推荐用Options模式更简洁可靠:
[FilterAlias("PhaseFilter")] public class PhaseFilter : IContextualFeatureFilter<PhaseContext> { public Task<bool> EvaluateAsync(FeatureFilterEvaluationContext featureFilterContext, PhaseContext phaseContext) { // 直接绑定到自定义配置类 var settings = featureFilterContext.Parameters.Get<PhaseFilterSettings>(); var allowedPhases = settings.AllowedPhases; var phases = phaseContext.Phases; return Task.FromResult(phases.Length > 0); } } public class PhaseContext { public string Phases { get; set; } } public class PhaseFilterSettings { public string AllowedPhases { get; set; } }
3. 确认注册与调用逻辑
Startup.cs中的注册代码无需修改:
services.AddFeatureManagement().AddFeatureFilter<PhaseFilter>();
调用逻辑保持原样即可:
string phases = "test"; bool isEnabled = await _featureManager.IsEnabledAsync("ShowLearningGoalsToCourseDirectors", new PhaseContext() { Phases = phases });
验证效果
修正配置后,框架会正确加载PhaseFilter并执行你的判断逻辑,传入phases = "test"时会返回true。
内容的提问来源于stack exchange,提问作者Andres
相关产品推荐
相关产品推荐

