Abilitare l'implementazione a fasi di funzionalità per destinatari specifici

La destinazione è una strategia di gestione delle funzionalità che consente agli sviluppatori di implementare progressivamente nuove funzionalità alla base degli utenti. La strategia si basa sul concetto di destinazione di un set di utenti noto come gruppo di destinatari. Un gruppo di destinatari è costituito da utenti, gruppi e una percentuale designata dell'intera base utenti.

  • Gli utenti possono essere account utente effettivi, ma possono anche essere computer, dispositivi o qualsiasi entità identificabile in modo univoco a cui si vuole implementare una funzionalità.

  • I gruppi sono fino all'applicazione da definire. Ad esempio, quando la destinazione è destinata agli account utente, è possibile usare gruppi o gruppi di Microsoft Entra che denota le posizioni degli utenti. Quando si punta ai computer, è possibile raggrupparli in base alle fasi di implementazione. I gruppi possono essere qualsiasi attributo comune in base al quale categorizzare il gruppo di destinatari.

Questo articolo illustra come implementare una nuova funzionalità in un'applicazione Web ASP.NET Core a utenti e gruppi specificati usando TargetingFilter con app Azure Configurazione.

Prerequisiti

Creare un'applicazione Web con autenticazione e flag di funzionalità

In questa sezione si creerà un'applicazione Web che consente agli utenti di accedere e usare il flag di funzionalità beta creato in precedenza. La maggior parte dei passaggi è molto simile a quella eseguita in Avvio rapido.

  1. Creare un'applicazione Web che esegue l'autenticazione in un database locale usando il comando seguente.

    dotnet new mvc --auth Individual -o TestFeatureFlags
    
  2. Aggiungere riferimenti ai pacchetti NuGet seguenti.

    dotnet add package Microsoft.Azure.AppConfiguration.AspNetCore
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    
  3. Archiviare il stringa di connessione per il negozio Configurazione app.

    dotnet user-secrets init
    dotnet user-secrets set ConnectionStrings:AppConfig "<your_connection_string>"
    
  4. Aggiornare Program.cs con il codice seguente.

    // 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
    // ... ...
    
  5. Aggiungere Beta.cshtml nella directory Views\Home e aggiornarlo con il markup seguente.

    @{
        ViewData["Title"] = "Beta Page";
    }
    
    <h1>This is the beta website.</h1>
    
  6. Aprire HomeController.cs nella directory Controllers e aggiornarla con il codice seguente.

    public IActionResult Beta()
    {
        return View();
    }
    
  7. Aprire _ViewImports.cshtml e registrare l'helper tag di Gestione funzionalità usando una @addTagHelper direttiva:

    @addTagHelper *, Microsoft.FeatureManagement.AspNetCore
    
  8. Aprire _Layout.cshtml nella directory Views\Shared. Inserire un nuovo <feature> tag tra gli elementi della barra di spostamento Home e Privacy .

    <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>
    
  9. Compilare ed eseguire. Selezionare quindi il collegamento Registra nell'angolo superiore destro per creare un nuovo account utente. Usare un indirizzo di posta elettronica di test@contoso.com. Nella schermata Registra conferma selezionare Fare clic qui per confermare l'account.

  10. Attivare o disattivare il flag di funzionalità in Configurazione app. Verificare che questa azione controlli la visibilità dell'elemento Beta sulla barra di spostamento.

Aggiornare il codice dell'applicazione Web da usare TargetingFilter

A questo punto, è possibile usare il flag di funzionalità per abilitare o disabilitare la Beta funzionalità per tutti gli utenti. Per abilitare il flag di funzionalità per alcuni utenti durante la disabilitazione per altri utenti, aggiornare il codice in modo da usare TargetingFilter. In questo esempio si usa l'indirizzo di posta elettronica dell'utente connesso come ID utente e la parte del nome di dominio dell'indirizzo di posta elettronica come gruppo. Aggiungere l'utente e il gruppo all'oggetto TargetingContext. TargetingFilter Usa questo contesto per determinare lo stato del flag di funzionalità per ogni richiesta.

  1. Aggiungere ExampleTargetingContextAccessor.cs file.

    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);
            }
        }
    }
    
  2. Aprire Program.cs e aggiungere l'oggetto ExampleTargetingContextAccessor creato nel passaggio precedente e TargetingFilter alla raccolta di servizi chiamando il WithTargeting metodo dopo la riga esistente di AddFeatureManagement. TargetingFilter Userà per ExampleTargetingContextAccessor determinare il contesto di destinazione ogni volta che viene valutato il flag di funzionalità.

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

    Nota

    Per le applicazioni Blazor, vedere le istruzioni per abilitare la gestione delle funzionalità come servizi con ambito.

Aggiornare il flag di funzionalità per usare TargetingFilter

  1. Nel portale di Azure passare all'archivio Configurazione app e selezionare Gestione funzionalità.

  2. Selezionare il menu di scelta rapida per il flag di funzionalità Beta creato nell'avvio rapido. Seleziona Modifica

    Edit Beta feature flag

  3. Nella schermata Modifica selezionare la casella di controllo Abilita flag di funzionalità se non è già selezionata. Selezionare quindi la casella di controllo Usa filtro funzionalità.

  4. Selezionare il pulsante Crea.

  5. Selezionare il filtro Destinazione nell'elenco a discesa Tipo di filtro.

  6. Selezionare la casella di controllo Override by Groups (Sostituisci per gruppi ) e Override by Users (Override by Users ).

  7. Selezionare le opzioni seguenti.

    • Percentuale predefinita: 0
    • Includi gruppi: immettere un nome di contoso.com e una percentuale di 50
    • Escludi gruppi: contoso-xyz.com
    • Includi utenti: test@contoso.com
    • Escludi utenti: testuser@contoso.com

    La schermata del filtro delle funzionalità avrà un aspetto simile al seguente.

    Conditional feature flag

    Queste impostazioni comportano il comportamento seguente.

    • Il flag di funzionalità è sempre disabilitato per l'utente testuser@contoso.comperché testuser@contoso.com è elencato nella sezione Escludi utenti .
    • Il flag di funzionalità è sempre disabilitato per gli utenti in contoso-xyz.com, perché contoso-xyz.com è elencato nella sezione Escludi gruppi .
    • Il flag di funzionalità è sempre abilitato per l'utente test@contoso.comperché test@contoso.com è elencato nella sezione Includi utenti .
    • Il flag di funzionalità è abilitato per il 50% degli utenti nel gruppo contoso.com , perché contoso.com è elencato nella sezione Includi gruppi con una percentuale di 50.
    • La funzionalità è sempre disabilitata per tutti gli altri utenti, perché la percentuale predefinita è impostata su 0.
  8. Selezionare Aggiungi per salvare il filtro di destinazione.

  9. Selezionare Applica per salvare queste impostazioni e tornare alla schermata Gestione funzionalità.

  10. Il filtro funzionalità per il flag di funzionalità viene ora visualizzato come Destinazione. Questo stato indica che il flag di funzionalità è abilitato o disabilitato per ogni richiesta, in base ai criteri applicati dal filtro di funzionalità targeting .

TargetingFilter in azione

Per visualizzare gli effetti di questo flag di funzionalità, compilare ed eseguire l'applicazione. Inizialmente, l'elemento Beta non viene visualizzato sulla barra degli strumenti, perché l'opzione Percentuale predefinita è impostata su 0.

Accedere ora come test@contoso.com, usando la password impostata durante la registrazione. L'elemento Beta viene ora visualizzato sulla barra degli strumenti, perché test@contoso.com è specificato come utente di destinazione.

Accedere ora come testuser@contoso.com, usando la password impostata durante la registrazione. L'elemento Beta non viene visualizzato sulla barra degli strumenti, perché testuser@contoso.com viene specificato come utente escluso.

Il video seguente illustra questo comportamento in azione.

TargetingFilter in action

È possibile creare più utenti con @contoso.com indirizzi di posta elettronica e @contoso-xyz.com per visualizzare il comportamento delle impostazioni del gruppo.

Gli utenti con contoso-xyz.com indirizzi di posta elettronica non vedranno l'elemento Beta . Mentre il 50% degli utenti con @contoso.com indirizzi di posta elettronica visualizzerà l'elemento Beta , l'altro 50% non visualizzerà l'elemento Beta .

Passaggi successivi