分阶段地向目标受众推出功能

目标定位是一种功能管理策略,使开发人员能够逐步向其用户群推出新功能。 该策略建立在面向一组称为目标受众的用户的概念之上。 受众由特定用户、组和占整个用户群的指定百分比的人数组成。

  • 用户可以是实际的用户帐户,但也可以是计算机、设备或想要向其推出功能的任何可唯一标识实体。

  • 组由应用程序定义。 例如,在面向用户帐户时,可以使用 Microsoft Entra 组或表示用户位置的组。 面向计算机时,可以根据推出阶段对它们进行分组。 组可以是要根据其对受众进行分类的任何常见属性。

在本文中,你将了解如何结合使用 TargetingFilter 和 Azure 应用程序配置来向指定的用户和组推出 ASP.NET Core Web 应用中的新功能。

先决条件

创建具有身份验证和功能标志的 Web 应用程序

在本部分,你将创建一个 Web 应用程序,它允许用户登录并使用之前创建的 Beta 功能标志。 大多数步骤你与在快速入门中执行的操作非常相似。

  1. 使用以下命令创建一个对本地数据库进行身份验证的 Web 应用。

    dotnet new mvc --auth Individual -o TestFeatureFlags
    
  2. 添加对以下 NuGet 包的引用。

    dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    
  3. 存储应用程序配置存储的连接字符串。

    dotnet user-secrets init
    dotnet user-secrets set ConnectionStrings:AppConfig "<your_connection_string>"
    
  4. 使用以下代码更新 Program.cs。

    // Existing code in Program.cs
    // ... ...
    
    var builder = WebApplication.CreateBuilder(args);
    
    // Retrieve the App Config connection string
    string AppConfigConnectionString = builder.Configuration.GetConnectionString("AppConfig");
    
    // Load configuration from Azure App Configuration
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        options.Connect(AppConfigConnectionString);
        options.UseFeatureFlags();
    });
    
    // Add Azure App Configuration middleware to the container of services
    builder.Services.AddAzureAppConfiguration();
    
    // Add feature management to the container of services
    builder.Services.AddFeatureManagement();
    
    // The rest of existing code in Program.cs
    // ... ...
    
    // Existing code in Program.cs
    // ... ...
    
    var app = builder.Build();
    
    // Use Azure App Configuration middleware for dynamic configuration refresh
    app.UseAzureAppConfiguration();
    
    // The rest of existing code in Program.cs
    // ... ...
    
  5. Views\Home 目录下添加 Beta.cshtml 并使用以下标记更新它。

    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  6. 打开 Controllers 目录下的 HomeController.cs,并使用以下代码更新它。

    public IActionResult Beta()
    {
        return View();
    }
    
  7. 打开 _ViewImports.cshtml,并使用 @addTagHelper 指令注册功能管理器标记帮助器:

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  8. 打开 Views\Shared 目录中的 _Layout.cshtml。 在“主页”和“隐私”导航栏项之间插入新的 <feature> 标记。

    <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
        <ul class="navbar-nav flex-grow-1">
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
            </li>
            <feature name="Beta">
                <li class="nav-item">
                    <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Beta">Beta</a>
                </li>
            </feature>
            <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
            </li>
        </ul>
        <partial name="_LoginPartial" />
    </div>
    
  9. 生成并运行。 然后选择右上角的“注册”链接,新建一个用户帐户。 使用电子邮件地址 test@contoso.com。 在“注册确认”屏幕上,选择“单击此处以确认帐户” 。

  10. 在应用程序配置中切换功能标志。 验证此操作是否控制导航栏上 Beta 项的可见性。

更新 Web 应用程序代码以使用 TargetingFilter

此时,可使用功能标志为所有用户启用或禁用 Beta 功能。 若要为某些用户启用功能标志,同时为其他用户禁用该标志,请更新代码以使用 TargetingFilter。 在本例中,你要将登录用户的电子邮件用作用户 ID,将电子邮件地址的域名部分用作组。 将用户和组添加到 TargetingContextTargetingFilter 使用此上下文来确定每个请求的功能标志的状态。

  1. 添加 ExampleTargetingContextAccessor.cs 文件。

    using Microsoft.AspNetCore.Http;
    using Microsoft.FeatureManagement.FeatureFilters;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace TestFeatureFlags
    {
        public class ExampleTargetingContextAccessor : ITargetingContextAccessor
        {
            private const string TargetingContextLookup = "ExampleTargetingContextAccessor.TargetingContext";
            private readonly IHttpContextAccessor _httpContextAccessor;
    
            public ExampleTargetingContextAccessor(IHttpContextAccessor httpContextAccessor)
            {
                _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
            }
    
            public ValueTask<TargetingContext> GetContextAsync()
            {
                HttpContext httpContext = _httpContextAccessor.HttpContext;
                if (httpContext.Items.TryGetValue(TargetingContextLookup, out object value))
                {
                    return new ValueTask<TargetingContext>((TargetingContext)value);
                }
                List<string> groups = new List<string>();
                if (httpContext.User.Identity.Name != null)
                {
                    groups.Add(httpContext.User.Identity.Name.Split("@", StringSplitOptions.None)[1]);
                }
                TargetingContext targetingContext = new TargetingContext
                {
                    UserId = httpContext.User.Identity.Name,
                    Groups = groups
                };
                httpContext.Items[TargetingContextLookup] = targetingContext;
                return new ValueTask<TargetingContext>(targetingContext);
            }
        }
    }
    
  2. 打开 Program.cs,并在现有的 AddFeatureManagement 行之后调用 WithTargeting 方法,将前面步骤中创建的 ExampleTargetingContextAccessorTargetingFilter 添加到服务集合中。 每次评估功能标志时,TargetingFilter 将使用 ExampleTargetingContextAccessor 来确定目标上下文。

    // Existing code in Program.cs
    // ... ...
    
    // Add feature management to the container of services
    builder.Services.AddFeatureManagement()
                    .WithTargeting<ExampleTargetingContextAccessor>();
    
    // The rest of existing code in Program.cs
    // ... ...
    

    注意

    对于 Blazor 应用程序,请参阅有关如何启用功能管理作为限定范围的服务的说明

更新功能标志以使用 TargetingFilter

  1. 在 Azure 门户中,转到应用程序配置存储并选择“功能管理器”。

  2. 选择在快速入门中创建的 Beta 功能标志的上下文菜单。 选择“编辑”。

    编辑 Beta 功能标志

  3. 如果尚未选中“编辑”屏幕中的“启用功能标志”复选框,请将其选中 。 然后,选中“使用功能筛选器”复选框。

  4. 选择“创建”按钮。

  5. 在筛选器类型下拉列表中选择“目标筛选器”。

  6. 选中“按组替代”和“按用户替代”复选框。

  7. 选择以下选项。

    • 默认百分比:0
    • 包括组:在“名称”中输入 contoso.com,并在“百分比”中输入 50
    • 排除组contoso-xyz.com
    • 包括用户test@contoso.com
    • 排除用户testuser@contoso.com

    功能筛选器屏幕将如下所示。

    条件功能标志

    这些设置会导致以下行为。

    • 由于“排除用户”部分列出了 testuser@contoso.com,因此始终为用户 testuser@contoso.com 禁用功能标志。
    • 由于“排除组”部分列出了 contoso-xyz.com,因此始终为 contoso-xyz.com 中的用户禁用功能标志。
    • 由于“包括用户”部分列出了 test@contoso.com,因此始终为用户 test@contoso.com 启用功能标志。
    • 由于“包括组”部分列出了 contoso.com,且“百分比”为 50,因此为 contoso.com 组中 50% 的用户启用了功能标志。
    • “默认百分比”设为 0,因此始终为其他所有用户禁用功能 。
  8. 选择“添加”以保存目标筛选器。

  9. 选择“应用”来保存这些设置,然后回到“功能管理器”屏幕 。

  10. 功能标志的功能筛选器现显示为“目标”。 此状态指示,功能标志会根据“目标”功能筛选器实施的条件,基于每个请求进行启用或禁用

TargetingFilter 的实际运用

若要查看此功能标志的效果,请生成并运行应用程序。 一开始,“默认百分比”选项设为 0,因此 Beta 项不在工具栏上显示。

立即使用注册时设置的密码以 test@contoso.com 身份登录。 由于 test@contoso.com 被指定为目标用户,因此 Beta 项现显示在工具栏上。

立即使用注册时设置的密码以 testuser@contoso.com 身份登录。 Beta 版项目不会显示在工具栏上,因为 testuser@contoso.com 被指定为排除的用户。

以下视频显示了正在起作用的这一行为。

TargetingFilter的实际运用

可使用 @contoso.com@contoso-xyz.com 电子邮件地址创建更多用户,以查看组设置的行为。

具有 contoso-xyz.com 电子邮件地址的用户将看不到 Beta 版项目。 50% 的具有 @contoso.com 电子邮件地址的用户将看到 Beta 版项目,而其他 50% 的用户将看不到 Beta 版项目。

后续步骤