你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:在 ASP.NET Core 应用程序中向目标受众推出功能

在本教程中,你将使用目标筛选器为 ASP.NET Core 应用程序的目标受众推出功能。 有关目标筛选器的详细信息,请参阅《向目标受众推出功能》

先决条件

使用功能标志创建 Web 应用程序

在本部分,你将创建一个 Web 应用程序,它允许用户登录并使用之前创建的 Beta 功能标志。

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

    dotnet new webapp --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. 将 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
    // ... ...
    
  5. 使用应用程序配置中间件从 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
    // ... ...
    
  6. 在 Pages 目录下添加一个名为 Beta 的新空白 Razor 页。 该页包含两个文件:Beta.cshtml 和 Beta.cshtml.cs。

    @page
    @model TestFeatureFlags.Pages.BetaModel
    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  7. 打开 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()
            {
            }
        }
    }
    
  8. 打开 Pages/_ViewImports.cshtml,使用 @addTagHelper 指令注册功能管理器标记帮助器

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  9. 打开 Pages/Shared 目录中的 _Layout.cshtml。 在“主页”和“隐私”导航栏项之间插入新的 <feature> 标记,如以下突出显示的行中所示 。

    <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
        <div class="container">
            <a class="navbar-brand" asp-area="" asp-page="/Index">TestAppConfigNet3</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                    aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                <ul class="navbar-nav flex-grow-1">
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                    </li>
                    <feature name="Beta">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Beta">Beta</a>
                        </li>
                    </feature>
                    <li class="nav-item">
                        <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    

为 Web 应用程序启用目标

目标筛选器根据用户的目标上下文评估用户的功能状态,该上下文由用户 ID 和用户所属的组组成。 在本例中,要将已登录用户的电子邮件用作用户 ID,将电子邮件地址的域名用作组。

  1. 使用下方代码添加 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);
            }
        }
    }
    
  2. 打开 Program.cs 文件,并通过调用 WithTargeting 方法启用目标筛选器。 传入类型 ExampleTargetingContextAccessor,目标筛选器将用此类型在功能标志评估期间获取目标上下文。 将 HttpContextAccessor 添加到服务集合,以允许 ExampleTargetingContextAccessorHttpContext 中访问已登录用户的信息。

    // 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 应用程序,请参阅有关如何启用功能管理作为限定范围的服务的说明

实际操作中的目标筛选器

  1. 生成并运行应用程序。 一开始,“默认百分比”选项设为 0,因此 Beta 项不在工具栏上显示。

    用户未登录且 Beta 项目未显示

  2. 选择右上角的“注册”链接,新建一个用户帐户。 使用电子邮件地址 test@contoso.com。 在“注册确认”屏幕上,选择“单击此处以确认帐户” 。

  3. 立即使用注册时设置的密码,以 test@contoso.com 的身份登录。

    由于 test@contoso.com 被指定为目标用户,因此 Beta 项现显示在工具栏上。

    用户已登录且 Beta 项目已显示

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

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

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

后续步骤

若要了解有关功能筛选器的详细信息,请继续学习以下教程。

有关 .NET 功能管理库的完整功能概要,请继续阅读以下文档。