教程:在 ASP.NET Core 应用程序中向目标受众推出功能
在本教程中,你将使用目标筛选器为 ASP.NET Core 应用程序的目标受众推出功能。 有关目标筛选器的详细信息,请参阅《向目标受众推出功能》。
先决条件
- 具有活动订阅的 Azure 帐户。 创建试用版订阅。
- 应用程序配置存储区。 创建存储区。
- 具有目标筛选器的功能标志。 创建功能标志。
- .NET SDK 6.0 或更高版本。
使用功能标志创建 Web 应用程序
在本部分,你将创建一个 Web 应用程序,它允许用户登录并使用之前创建的 Beta 功能标志。
使用以下命令创建一个对本地数据库进行身份验证的 Web 应用。
dotnet new webapp --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>"
将 Azure 应用程序配置和功能管理添加到应用程序。
使用以下代码更新 Program.cs 文件。
// Existing code in Program.cs // ... ... var builder = WebApplication.CreateBuilder(args); // Retrieve the App Config connection string string AppConfigConnectionString = builder.Configuration.GetConnectionString("AppConfig") ?? throw new InvalidOperationException("Connection string 'AppConfig' not found."); ; // Load feature flag 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 // ... ...
使用应用程序配置中间件从 Azure 应用程序配置启用配置和功能标志刷新。
使用以下代码更新 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 // ... ...
在 Pages 目录下添加一个名为 Beta 的新空白 Razor 页。 该页包含两个文件:Beta.cshtml 和 Beta.cshtml.cs。
@page @model TestFeatureFlags.Pages.BetaModel @{ ViewData["Title"] = "Beta Page"; } <h1>This is the beta website.</h1>
打开 Beta.cshtml.cs,并将
FeatureGate
属性添加到BetaModel
类。using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.FeatureManagement.Mvc; namespace TestFeatureFlags.Pages { [FeatureGate("Beta")] public class BetaModel : PageModel { public void OnGet() { } } }
打开 Pages/_ViewImports.cshtml,使用
@addTagHelper
指令注册功能管理器标记帮助器。@addTagHelper *, Microsoft.FeatureManagement.AspNetCore
打开 Pages/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>
为 Web 应用程序启用目标
目标筛选器根据用户的目标上下文评估用户的功能状态,该上下文由用户 ID 和用户所属的组组成。 在本例中,要将已登录用户的电子邮件用作用户 ID,将电子邮件地址的域名用作组。
使用下方代码添加 ExampleTargetingContextAccessor.cs 文件。 实现
ITargetingContextAccessor
接口,为当前请求的已登录用户提供目标上下文。using Microsoft.FeatureManagement.FeatureFilters; 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 文件,并通过调用
WithTargeting
方法启用目标筛选器。 传入类型ExampleTargetingContextAccessor
,目标筛选器将用此类型在功能标志评估期间获取目标上下文。 将HttpContextAccessor
添加到服务集合,以允许ExampleTargetingContextAccessor
从HttpContext
中访问已登录用户的信息。// Existing code in Program.cs // ... ... // Add feature management to the container of services builder.Services.AddFeatureManagement() .WithTargeting<ExampleTargetingContextAccessor>(); // Add HttpContextAccessor to the container of services. builder.Services.AddHttpContextAccessor(); // The rest of existing code in Program.cs // ... ...
注意
对于 Blazor 应用程序,请参阅有关如何启用功能管理作为限定范围的服务的说明。
实际操作中的目标筛选器
生成并运行应用程序。 一开始,“默认百分比”选项设为 0,因此 Beta 项不在工具栏上显示。
选择右上角的“注册”链接,新建一个用户帐户。 使用电子邮件地址
test@contoso.com
。 在“注册确认”屏幕上,选择“单击此处以确认帐户” 。立即使用注册时设置的密码,以
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 版项目。
后续步骤
若要了解有关功能筛选器的详细信息,请继续学习以下教程。
有关 .NET 功能管理库的完整功能概要,请继续阅读以下文档。