Udostępnij za pośrednictwem


Wdrażanie funkcji dla docelowych odbiorców w aplikacji ASP.NET Core

W tym przewodniku użyjesz filtru określania wartości docelowej, aby wdrożyć funkcję dla docelowych odbiorców dla aplikacji ASP.NET Core. Aby uzyskać więcej informacji na temat filtru określania wartości docelowej, zobacz Wdrażanie funkcji dla docelowych odbiorców.

Wymagania wstępne

Tworzenie aplikacji internetowej z flagą funkcji

W tej sekcji utworzysz aplikację internetową, która umożliwia użytkownikom logowanie się i korzystanie z flagi funkcji beta utworzonej wcześniej.

  1. Utwórz aplikację internetową, która uwierzytelnia się w lokalnej bazie danych przy użyciu następującego polecenia.

    dotnet new webapp --auth Individual -o TestFeatureFlags
    
  2. Przejdź do nowo utworzonego katalogu TestFeatureFlags i dodaj odwołania do następujących pakietów NuGet.

    dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    dotnet add package Azure.Identity
    
  3. Utwórz wpis tajny użytkownika dla aplikacji, uruchamiając następujące polecenia.

    Polecenie używa programu Secret Manager do przechowywania wpisu tajnego o nazwie Endpoints:AppConfiguration, który przechowuje punkt końcowy dla magazynu usługi App Configuration. Zastąp <your-App-Configuration-endpoint> symbol zastępczy punktem końcowym sklepu App Configuration. Punkt końcowy można znaleźć w bloku Przegląd sklepu App Configuration w witrynie Azure Portal.

    dotnet user-secrets init
    dotnet user-secrets set Endpoints:AppConfiguration "<your-App-Configuration-endpoint>"
    
  4. Dodaj aplikacja systemu Azure Konfiguracja i zarządzanie funkcjami do aplikacji.

    1. Użyj polecenia DefaultAzureCredential , aby uwierzytelnić się w magazynie usługi App Configuration. Postępuj zgodnie z instrukcjami, aby przypisać poświadczenia roli Czytelnik danych konfiguracji aplikacji. Przed uruchomieniem aplikacji należy zezwolić na wystarczający czas na propagację uprawnień.

    2. Zaktualizuj plik Program.cs przy użyciu następującego kodu.

      // Existing code in Program.cs
      // ... ...
      
      using Azure.Identity;
      
      var builder = WebApplication.CreateBuilder(args);
      
      // Retrieve the endpoint
      string endpoint = builder.Configuration.GetValue<string>("Endpoints:AppConfiguration") 
          ?? throw new InvalidOperationException("The setting `Endpoints:AppConfiguration` was not found.");
      
      // Connect to Azure App Configuration and load all feature flags with no label
      builder.Configuration.AddAzureAppConfiguration(options =>
      {
          options.Connect(new Uri(endpoint), new DefaultAzureCredential())
                 .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. Włącz odświeżanie konfiguracji i flagi funkcji z aplikacja systemu Azure Configuration przy użyciu oprogramowania pośredniczącego App Configuration.

    Zaktualizuj Program.cs przy użyciu następującego kodu.

    // 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. Dodaj nową pustą stronę Razor o nazwie Beta w katalogu Pages. Zawiera dwa pliki Beta.cshtml i Beta.cshtml.cs.

    @page
    @model TestFeatureFlags.Pages.BetaModel
    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  7. Otwórz Beta.cshtml.cs i dodaj FeatureGate atrybut do BetaModel klasy.

    using Microsoft.AspNetCore.Mvc.RazorPages;
    using Microsoft.FeatureManagement.Mvc;
    
    namespace TestFeatureFlags.Pages
    {
        [FeatureGate("Beta")]
        public class BetaModel : PageModel
        {
            public void OnGet()
            {
            }
        }
    }
    
  8. Otwórz plik Pages/_ViewImports.cshtml i zarejestruj pomocnika tagów menedżera funkcji przy użyciu @addTagHelper dyrektywy .

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  9. Otwórz plik _Layout.cshtml w katalogu Pages/Shared . Wstaw nowy <feature> tag między elementami paska nawigacyjnego Strona główna i Prywatność , jak pokazano w wyróżnionych wierszach poniżej.

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

Włączanie określania wartości docelowej dla aplikacji internetowej

Filtr określania wartości docelowej ocenia stan funkcji użytkownika na podstawie kontekstu określania wartości docelowej użytkownika, który obejmuje identyfikator użytkownika i grupy, do których należy użytkownik. W tym przykładzie adres e-mail zalogowanego użytkownika jest używany jako identyfikator użytkownika i nazwa domeny adresu e-mail jako grupa.

  1. Dodaj plik ExampleTargetingContextAccessor.cs z następującym kodem. Zaimplementujesz ITargetingContextAccessor interfejs, aby zapewnić kontekst określania wartości docelowej dla zalogowanego użytkownika bieżącego żądania.

    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. Otwórz plik Program.cs i włącz filtr określania wartości docelowej, wywołując metodę WithTargeting . Przekażesz typ ExampleTargetingContextAccessor , który będzie używany przez filtr określania wartości docelowej, aby uzyskać kontekst określania wartości docelowej podczas oceny flagi funkcji. Dodaj HttpContextAccessor element do kolekcji usług, aby zezwolić na ExampleTargetingContextAccessor dostęp do informacji o zalogowanym użytkowniku z witryny 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
    // ... ...
    

    Uwaga

    Aby uzyskać informacje o aplikacjach Platformy Blazor, zobacz instrukcje dotyczące włączania zarządzania funkcjami jako usług o określonym zakresie.

Filtr określania wartości docelowej w akcji

  1. Skompiluj i uruchom aplikację. Początkowo element beta nie jest wyświetlany na pasku narzędzi, ponieważ opcja Wartość procentowa domyślna jest ustawiona na 0.

    Użytkownik nie jest zalogowany i nie jest wyświetlany element beta

  2. Wybierz link Zarejestruj w prawym górnym rogu, aby utworzyć nowe konto użytkownika. Użyj adresu e-mail .test@contoso.com Na ekranie Zarejestruj potwierdzenie wybierz pozycję Kliknij tutaj, aby potwierdzić swoje konto.

  3. Zaloguj się jako test@contoso.com, używając hasła ustawionego podczas rejestrowania konta.

    Element beta jest teraz wyświetlany na pasku narzędzi, ponieważ test@contoso.com jest określony jako docelowy użytkownik.

    Użytkownik zalogowany i wyświetlony element beta

    Teraz zaloguj się jako testuser@contoso.com, używając hasła ustawionego podczas rejestrowania konta. Element beta nie jest wyświetlany na pasku narzędzi, ponieważ testuser@contoso.com jest określony jako wykluczony użytkownik.

    Aby zobaczyć zachowanie ustawień grupy, możesz utworzyć więcej użytkowników z adresami @contoso.com e-mail i @contoso-xyz.com adresami e-mail.

    Użytkownicy z adresami contoso-xyz.com e-mail nie zobaczą elementu beta . Chociaż 50% użytkowników z adresami @contoso.com e-mail zobaczy element beta , pozostałe 50% nie będzie widzieć elementu beta .

Następne kroki

Aby dowiedzieć się więcej na temat filtrów funkcji, przejdź do następujących dokumentów.

Aby uruchomić pełną funkcję biblioteki zarządzania funkcjami platformy .NET, przejdź do następującego dokumentu.