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

如何使用功能标志(Feature Flag)禁用与启用Azure Function?

借助功能标志(Feature Flag)实现Azure Function禁用/启用的可行方案

下面是几种实用的实现方案,覆盖不同场景需求:

方案1:函数入口校验(单函数精准控制)

这是最通用的方案,适用于所有类型的Azure Function,在函数执行前直接校验Feature Flag状态,决定是否执行核心逻辑。

操作步骤:

  1. 在Azure App Configuration中创建目标函数对应的Feature Flag(例如命名为Enable-MyTargetFunction),默认设置为启用状态。
  2. 在Function项目中安装依赖包:Microsoft.FeatureManagement 和 Microsoft.Azure.AppConfiguration.Functions。
  3. 注入IFeatureManager并在函数入口校验:
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.FeatureManagement;

public class MyTargetFunction
{
    private readonly IFeatureManager _featureManager;

    public MyTargetFunction(IFeatureManager featureManager)
    {
        _featureManager = featureManager;
    }

    [FunctionName("MyTargetFunction")]
    public async Task Run(
        [TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
        ILogger log)
    {
        // 检查功能标志状态
        if (!await _featureManager.IsEnabledAsync("Enable-MyTargetFunction"))
        {
            log.LogInformation("函数已通过Feature Flag禁用,跳过本次执行");
            return;
        }

        // 执行核心业务逻辑
        log.LogInformation("函数正常执行,当前时间: {time}", DateTime.Now);
    }
}

配置补充:

在应用设置(或local.settings.json)中添加App Configuration连接字符串:

{
  "ConnectionStrings": {
    "AppConfig": "你的Azure App Configuration连接字符串"
  }
}

在Program.cs中初始化Feature Management:

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureAppConfiguration(builder =>
    {
        var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings:AppConfig");
        builder.AddAzureAppConfiguration(options =>
        {
            options.Connect(connectionString)
                   .UseFeatureFlags();
        });
    })
    .ConfigureServices(services =>
    {
        services.AddFeatureManagement();
    })
    .Build();

host.Run();

方案2:Host级别全局控制(批量禁用/启用)

如果需要批量控制多个Function,可以在Host启动时根据Feature Flag决定是否注册函数服务,实现全局开关。

操作示例:

var hostBuilder = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults();

// 初始化配置与FeatureManager
var config = hostBuilder.BuildConfiguration();
var featureManager = config.GetFeatureManager();

// 根据全局Feature Flag决定是否注册函数
if (await featureManager.IsEnabledAsync("Enable-AllFunctions"))
{
    hostBuilder.ConfigureServices(services =>
    {
        services.AddScoped<MyTargetFunction>();
        services.AddScoped<AnotherFunction>();
    });
}

var host = hostBuilder.Build();
host.Run();

注意:这种方式在Host启动时读取一次Feature Flag,若要实时生效,需结合App Configuration的缓存刷新机制,或重启Function App。

方案3:HTTP触发器专属拦截

针对HTTP类型的Function,可以直接在触发器层面拦截请求,返回标准HTTP状态码,无需进入函数逻辑。

代码示例:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.FeatureManagement;

public class HttpTriggerFunction
{
    private readonly IFeatureManager _featureManager;

    public HttpTriggerFunction(IFeatureManager featureManager)
    {
        _featureManager = featureManager;
    }

    [FunctionName("HttpTriggerFunction")]
    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        if (!await _featureManager.IsEnabledAsync("Enable-HttpTriggerFunction"))
        {
            log.LogInformation("HTTP函数已禁用,拒绝请求");
            return new StatusCodeResult(StatusCodes.Status403Forbidden);
        }

        // 执行核心HTTP处理逻辑
        return new OkObjectResult("Function is active");
    }
}

额外注意事项:

  • 实时生效配置:默认Feature Flag会缓存5分钟,若需要更快的生效速度,可在配置时设置缓存过期时间:
    options.UseFeatureFlags(options => options.CacheExpirationInterval = TimeSpan.FromMinutes(1));
    
  • 权限管控:限制Azure App Configuration的Feature Flag修改权限,仅授权人员可操作,避免误禁用。
  • 日志监控:在禁用分支添加日志记录,便于后续排查执行异常问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:35:26