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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:22:18