分阶段地向目标受众推出功能
目标定位是一种功能管理策略,使开发人员能够逐步向其用户群推出新功能。 该策略建立在面向一组称为目标受众的用户的概念之上。 受众由特定用户、组和占整个用户群的指定百分比的人数组成。
用户可以是实际的用户帐户,但也可以是计算机、设备或想要向其推出功能的任何可唯一标识实体。
组由应用程序定义。 例如,在面向用户帐户时,可以使用 Microsoft Entra 组或表示用户位置的组。 面向计算机时,可以根据推出阶段对它们进行分组。 组可以是要根据其对受众进行分类的任何常见属性。
在本文中,你将了解如何结合使用 TargetingFilter
和 Azure 应用程序配置来向指定的用户和组推出 ASP.NET Core Web 应用中的新功能。
先决条件
- 完成快速入门: 向 ASP.NET Core 应用添加功能标志。
- 将
Microsoft.FeatureManagement.AspNetCore
包更新到版本 3.0.0 或更高版本。
创建具有身份验证和功能标志的 Web 应用程序
在本部分,你将创建一个 Web 应用程序,它允许用户登录并使用之前创建的 Beta 功能标志。 大多数步骤你与在快速入门中执行的操作非常相似。
使用以下命令创建一个对本地数据库进行身份验证的 Web 应用。
dotnet new mvc --auth Individual -o TestFeatureFlags
添加对以下 NuGet 包的引用。
dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore dotnet add package Microsoft.FeatureManagement.AspNetCore
存储应用程序配置存储的连接字符串。
dotnet user-secrets init dotnet user-secrets set ConnectionStrings:AppConfig "<your_connection_string>"
使用以下代码更新 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 // ... ...
在 Views\Home 目录下添加 Beta.cshtml 并使用以下标记更新它。
@{ ViewData["Title"] = "Beta Page"; } <h1>This is the beta website.</h1>
打开 Controllers 目录下的 HomeController.cs,并使用以下代码更新它。
public IActionResult Beta() { return View(); }
打开 _ViewImports.cshtml,并使用
@addTagHelper
指令注册功能管理器标记帮助器:@addTagHelper *, Microsoft.FeatureManagement.AspNetCore
打开 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>
生成并运行。 然后选择右上角的“注册”链接,新建一个用户帐户。 使用电子邮件地址
test@contoso.com
。 在“注册确认”屏幕上,选择“单击此处以确认帐户” 。在应用程序配置中切换功能标志。 验证此操作是否控制导航栏上 Beta 项的可见性。
更新 Web 应用程序代码以使用 TargetingFilter
此时,可使用功能标志为所有用户启用或禁用 Beta
功能。 若要为某些用户启用功能标志,同时为其他用户禁用该标志,请更新代码以使用 TargetingFilter
。 在本例中,你要将登录用户的电子邮件用作用户 ID,将电子邮件地址的域名部分用作组。 将用户和组添加到 TargetingContext
。 TargetingFilter
使用此上下文来确定每个请求的功能标志的状态。
添加 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); } } }
打开
Program.cs
,并在现有的AddFeatureManagement
行之后调用WithTargeting
方法,将前面步骤中创建的ExampleTargetingContextAccessor
和TargetingFilter
添加到服务集合中。 每次评估功能标志时,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
在 Azure 门户中,转到应用程序配置存储并选择“功能管理器”。
选择在快速入门中创建的 Beta 功能标志的上下文菜单。 选择“编辑”。
如果尚未选中“编辑”屏幕中的“启用功能标志”复选框,请将其选中 。 然后,选中“使用功能筛选器”复选框。
选择“创建”按钮。
在筛选器类型下拉列表中选择“目标筛选器”。
选中“按组替代”和“按用户替代”复选框。
选择以下选项。
- 默认百分比: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,因此始终为其他所有用户禁用功能 。
选择“添加”以保存目标筛选器。
选择“应用”来保存这些设置,然后回到“功能管理器”屏幕 。
功能标志的功能筛选器现显示为“目标”。 此状态指示,功能标志会根据“目标”功能筛选器实施的条件,基于每个请求进行启用或禁用。
TargetingFilter 的实际运用
若要查看此功能标志的效果,请生成并运行应用程序。 一开始,“默认百分比”选项设为 0,因此 Beta 项不在工具栏上显示。
立即使用注册时设置的密码以 test@contoso.com
身份登录。 由于 test@contoso.com
被指定为目标用户,因此 Beta 项现显示在工具栏上。
立即使用注册时设置的密码以 testuser@contoso.com
身份登录。 Beta 版项目不会显示在工具栏上,因为 testuser@contoso.com
被指定为排除的用户。
以下视频显示了正在起作用的这一行为。
可使用 @contoso.com
和 @contoso-xyz.com
电子邮件地址创建更多用户,以查看组设置的行为。
具有 contoso-xyz.com
电子邮件地址的用户将看不到 Beta 版项目。 50% 的具有 @contoso.com
电子邮件地址的用户将看到 Beta 版项目,而其他 50% 的用户将看不到 Beta 版项目。