快速入门:向 Azure Functions 应用添加功能标志

在该快速入门中,你将创建一个 Azure Functions C# 代码项目并在其中使用功能标志。 可使用 Azure 应用程序配置中的功能管理集中存储所有功能标志并控制其状态。

.NET 功能管理库使用功能标志支持扩展该框架。 这些库在 .NET 配置系统的基础上构建。 它们通过其 .NET 配置提供程序与应用程序配置集成。

注意

本文目前仅支持在 .NET 6 上运行的 C# 进程中函数应用

先决条件

添加功能标志

将名为“Beta”的功能标志添加到应用程序配置存储区,并将“标签”和“描述”保留为其默认值。 有关如何使用 Azure 门户或 CLI 将功能标志添加到存储区的详细信息,请转到创建功能标志

启用名为 Beta 的功能标志

创建 Functions 项目

Visual Studio 中的 Azure Functions 项目模板创建了一个 C# 类库项目,该项目可发布到 Azure 中的函数应用。 可使用函数应用将函数分组为逻辑单元,以便更轻松地管理、部署、缩放和共享资源。

  1. 在 Visual Studio 菜单中,选择“文件”>“新建”>“项目”。

  2. 在“创建新项目”中,在搜索框中输入“functions”,选择“Azure Functions”模板,然后选择“下一步”

  3. 在“配置新项目”中,输入项目的“项目名称”,然后选择“创建”。 函数应用名称必须可以充当 C# 命名空间,因此请勿使用下划线、连字符或任何其他的非字母数字字符。

  4. 对于“创建新的 Azure Functions 应用程序”设置,请使用下表中的值:

    设置 说明
    .NET 版本 .NET 6 此值会创建一个函数项目,该项目在进程内使用 Azure Functions 运行时版本 4.x 运行。 有关详细信息,请参阅 Azure Functions 运行时版本概述
    函数模板 HTTP 触发器 此值会创建由 HTTP 请求触发的函数。
    存储帐户(AzureWebJobsStorage) 存储模拟器 由于 Azure 中的函数应用需要存储帐户,因此在将项目发布到 Azure 时会分配或创建一个存储帐户。 HTTP 触发器不使用 Azure 存储帐户连接字符串;所有其他触发器类型需要有效的 Azure 存储帐户连接字符串。
    授权级别 匿名 在未提供密钥的情况下,任何客户端都可以触发创建的函数。 通过此授权设置可以轻松测试新函数。 有关密钥和授权的详细信息,请参阅授权密钥HTTP 和 Webhook 绑定

    Azure Functions 项目设置的屏幕截图


    请确保将“授权级别”设置为“匿名”。 如果选择默认级别的函数,需要在请求中提供函数密钥才能访问函数终结点。

  5. 选择“创建”以创建函数项目和 HTTP 触发器函数。

连接到应用程序配置存储区

此项目将 .NET Azure Functions 中使用依赖项注入。 它将 Azure 应用程序配置添加为存储功能标志的额外配置源。

  1. 右键单击项目,然后选择“管理 NuGet 包” 。 在“浏览”选项卡中,搜索以下 NuGet 包并将其添加到项目中。

  2. 使用以下代码添加新文件 Startup.cs。 它定义了一个名为 Startup 的类,该类实现了 FunctionsStartup 抽象类。 程序集属性用于指定 Azure Functions 启动期间使用的类型名称。

    using System;
    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.Configuration;
    using Microsoft.FeatureManagement;
    
    [assembly: FunctionsStartup(typeof(FunctionApp.Startup))]
    
    namespace FunctionApp
    {
        class Startup : FunctionsStartup
        {
            public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
            {
            }
    
            public override void Configure(IFunctionsHostBuilder builder)
            {
            }
        }
    }
    
  3. 更新 ConfigureAppConfiguration 方法,并通过调用 AddAzureAppConfiguration() 将 Azure 应用程序配置提供程序添加为额外的配置源。

    UseFeatureFlags() 方法告知提供程序加载功能标志。 在重新检查更改之前,所有功能标志的默认缓存过期时间为 30 秒。 可以通过设置传递给 UseFeatureFlags 方法的 FeatureFlagsOptions.CacheExpirationInterval 属性来更新过期时间间隔。

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                   .Select("_")
                   .UseFeatureFlags();
        });
    }
    

    提示

    如果不想将除功能标志以外的任何配置加载到应用程序中,可以调用 Select("_"),只加载不存在的伪键 "_"。 默认情况下,如果未调用 Select 方法,则将加载应用程序配置存储中的所有配置键值。

  4. 更新 Configure 方法,通过依赖项注入使 Azure 应用程序配置服务和功能管理器可用。

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddAzureAppConfiguration();
        builder.Services.AddFeatureManagement();
    }
    
  5. 打开 Function1.cs,并添加以下命名空间。

    using System.Linq;
    using Microsoft.FeatureManagement;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    

    添加一个构造函数,用于通过依赖项注入获得 _featureManagerSnapshotIConfigurationRefresherProvider 实例。 在 IConfigurationRefresherProvider 中,你可以获得 IConfigurationRefresher 的实例。

    private readonly IFeatureManagerSnapshot _featureManagerSnapshot;
    private readonly IConfigurationRefresher _configurationRefresher;
    
    public Function1(IFeatureManagerSnapshot featureManagerSnapshot, IConfigurationRefresherProvider refresherProvider)
    {
        _featureManagerSnapshot = featureManagerSnapshot;
        _configurationRefresher = refresherProvider.Refreshers.First();
    }
    
  6. 更新 Run 方法,根据功能标志的状态更改显示的消息的值。

    在函数调用开始时调用 TryRefreshAsync 方法以刷新功能标志。 如果未到达缓存过期时间范围,则将是一个 no-op 操作。 如果希望在不阻止当前函数调用的情况下刷新功能标志,请删除 await 运算符。 在这种情况下,以后的函数调用将获得更新的值。

    [FunctionName("Function1")]
    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        await _configurationRefresher.TryRefreshAsync();
    
        string message = await _featureManagerSnapshot.IsEnabledAsync("Beta")
                ? "The Feature Flag 'Beta' is turned ON"
                : "The Feature Flag 'Beta' is turned OFF";
    
        return (ActionResult)new OkObjectResult(message);
    }
    

在本地测试函数

  1. 设置一个名为 ConnectionString 的环境变量,其中值是之前在“访问密钥”下的应用程序配置存储中检索到的连接字符串 。 如果使用 Windows 命令提示符,则请运行以下命令并重启命令提示符,这样更改才会生效:

        setx ConnectionString "connection-string-of-your-app-configuration-store"
    

    如果使用 Windows PowerShell,请运行以下命令:

        $Env:ConnectionString = "connection-string-of-your-app-configuration-store"
    

    如果使用 macOS 或 Linux,则请运行以下命令:

        export ConnectionString='connection-string-of-your-app-configuration-store'
    
  2. 按 F5 测试函数。 如果系统提示,请按 Visual Studio 的请求下载和安装 Azure Functions Core (CLI) 工具。 你还需要启用防火墙例外,这样工具才能处理 HTTP 请求。

  3. 从 Azure Functions 运行时输出复制函数的 URL。

    在 VS 中的函数调试快速入门

  4. 将 HTTP 请求的 URL 粘贴到浏览器的地址栏。 下图显示了指出功能标志 Beta 已被禁用的响应。

    已禁用快速入门函数功能标志

  5. 登录 Azure 门户。 选择“所有资源”,然后选择你创建的应用程序配置存储区。

  6. 选择“功能管理器”,将“Beta”密钥的状态更改为“启用”。

  7. 多次刷新浏览器。 当刷新间隔时间窗口过去后,页面将发生变化以指示功能标志 Beta 已打开,如下图所示。

    已启用快速入门函数功能标志

注意

本教程中使用的示例代码可从 Azure 应用程序配置 GitHub 存储库下载。

清理资源

如果不想继续使用本文中创建的资源,请删除此处创建的资源组以避免产生费用。

重要

删除资源组的操作不可逆。 将永久删除资源组以及其中的所有资源。 请确保不要意外删除错误的资源组或资源。 如果在包含要保留的其他资源的资源组中创建了本文的资源,请从相应的窗格中单独删除每个资源,而不是删除该资源组。

  1. 登录到 Azure 门户,然后选择“资源组”。
  2. 在“按名称筛选”框中,输入资源组的名称
  3. 在结果列表中,选择资源组名称以查看概述。
  4. 选择“删除资源组”。
  5. 系统会要求确认是否删除资源组。 重新键入资源组的名称进行确认,然后选择“删除” 。

片刻之后,将会删除该资源组及其所有资源。

后续步骤

在本快速入门中,你创建了一个功能标志,并通过 Microsoft.FeatureManagement 库将它用于 Azure Functions 应用。