Бөлісу құралы:


Руководство. Развертывание функций для целевых аудиторий в приложении ASP.NET Core

В этом руководстве вы будете использовать фильтр целевого назначения для развертывания функции целевой аудитории для вашего приложения ASP.NET Core. Дополнительные сведения о фильтре целевого назначения см. в статье "Развертывание функций для целевых аудиторий".

Необходимые компоненты

Создание веб-приложения с флагом компонента

В этом разделе вы создадите веб-приложение, которое позволяет пользователям входить и использовать флаг бета-функции , созданный ранее.

  1. Создайте веб-приложение, которое проходит проверку подлинности в локальной базе данных с помощью следующей команды.

    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. Добавьте новую пустую страницу Razor с именем Beta в каталоге Pages. Он включает два файла 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. Откройте файл _Layout.cshtml в каталоге Pages/Shared . Вставьте новый тег <feature> между пунктами навигации Home и Privacy, как показано ниже.

    <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>
    

Включение целевого объекта для веб-приложения

Фильтр целевого объекта оценивает состояние функции пользователя на основе контекста целевого пользователя, который включает идентификатор пользователя и группы, к которым принадлежит пользователь. В этом примере вы используете адрес электронной почты пользователя, выполнившего вход, в качестве идентификатора пользователя и доменного имени адреса электронной почты в качестве группы.

  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 в коллекцию служб доступ 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 см . в инструкциях по включению управления функциями в качестве служб с областью действия.

Назначение фильтра в действии

  1. Выполните сборку приложения и запустите его. Изначально элемент Beta не отображается на панели инструментов, так как параметр Процент по умолчанию имеет значение 0.

    Пользователь не вошел в систему и не отображается бета-элемент

  2. Щелкните ссылку "Регистрация " в правом верхнем углу, чтобы создать новую учетную запись пользователя. Используйте адрес электронной почты test@contoso.com. На экране Подтверждение регистрации выберите Щелкните здесь, чтобы подтвердить свою учетную запись.

  3. test@contoso.comВойдите как, используя пароль, заданный при регистрации учетной записи.

    Теперь на панели инструментов отображается элемент Beta, так как test@contoso.com указан как целевой пользователь.

    Пользователь, вошедший в систему и отображаемый элемент бета-версии

    Теперь войдите как testuser@contoso.com, используя пароль, заданный при регистрации учетной записи. Элемент бета-версии не отображается на панели инструментов, так как testuser@contoso.com указан как исключенный пользователь.

    Вы можете создать больше пользователей с @contoso.com адресами электронной почты и @contoso-xyz.com просмотреть поведение параметров группы.

    Пользователи с contoso-xyz.com адресами электронной почты не увидят бета-элемент . Хотя 50% пользователей с @contoso.com адресами электронной почты увидят бета-элемент , остальные 50% не увидят бета-элемент .

Следующие шаги

Дополнительные сведения о фильтрах функций см. в следующих руководствах.

Для полного запуска функции библиотеки управления функциями .NET перейдите к следующему документу.