Compartir a través de


Tutorial: Uso de marcas de características variantes en una aplicación ASP.NET Core

En este tutorial, se usa una marca de característica de variante para administrar experiencias para distintos segmentos de usuarios en una aplicación de ejemplo, Cita del día. Usará la marca de característica de variante creada en Uso de marcas de característica de variante. Antes de continuar, asegúrese de crear la marca de característica de variante llamada Saludo en su almacén de App Configuration.

Requisitos previos

Cree una aplicación web ASP.NET Core

  1. Ejecute el código siguiente en un símbolo del sistema. Este comando crea una nueva aplicación Razor Pages en ASP.NET Core, mediante la autenticación de cuenta individual y la coloca en una carpeta de salida denominada QuoteOfTheDay.

    dotnet new razor --auth Individual -o QuoteOfTheDay
    
  2. Vaya al directorio QuoteOfTheDay y cree un secreto de usuario para la aplicación mediante la ejecución de los siguientes comandos. Reemplace el marcador de posición <your-App-Configuration-endpoint> por el punto de conexión del almacén de App Configuration. Puede encontrar el punto de conexión en la hoja Información general del almacén de App Configuration en Azure Portal.

    dotnet user-secrets init
    dotnet user-secrets set Endpoints:AppConfiguration "<your-App-Configuration-endpoint>"
    
  3. Agregue las versiones más recientes de los paquetes necesarios.

    dotnet add package Azure.Identity
    dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
    dotnet add package Microsoft.FeatureManagement.AspNetCore
    

Conexión a App Configuration para la administración de características

  1. Abra Program.cs y agregue las siguientes instrucciones.

    using Azure.Identity;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    using Microsoft.FeatureManagement;
    
  2. Agregue el código siguiente para conectarse al almacén de App Configuration y llame a UseFeatureFlags para extraer todas las marcas de características sin etiqueta.

    Use DefaultAzureCredential para autenticarse en el almacén de App Configuration. Siga las instrucciones para asignar la credencial al rol Lector de datos de App Configuration. Asegúrese de dejar tiempo suficiente para que el permiso se propague antes de ejecutar la aplicación.

    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.");
    
    // Load configuration and feature flags from Azure App Configuration
    builder.Configuration
        .AddAzureAppConfiguration(options =>
        {
            options.Connect(new Uri(endpoint), new DefaultAzureCredential())
                   .UseFeatureFlags();
        });
    
  3. Agregue los servicios de administración de características y Azure App Configuration y habilite la selección de destinos para la administración de características.

    // Add Azure App Configuration and feature management services to the container.
    builder.Services.AddAzureAppConfiguration()
        .AddFeatureManagement()
        .WithTargeting();
    
  4. Bajo la línea var app = builder.Build();, agregue el middleware de Azure App Configuration para la actualización dinámica de la configuración.

    // Use Azure App Configuration middleware for dynamic configuration refresh.
    app.UseAzureAppConfiguration();
    

Uso de la marca de característica de variante

  1. Abra QuoteOfTheDay>Páginas>Index.cshtml.cs y reemplace el contenido por el siguiente código.

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    using Microsoft.FeatureManagement;
    
    namespace QuoteOfTheDay.Pages;
    
    public class Quote
    {
        public string Message { get; set; }
    
        public string Author { get; set; }
    }
    
    public class IndexModel(IVariantFeatureManagerSnapshot featureManager) : PageModel
    {
        private readonly IVariantFeatureManagerSnapshot _featureManager = featureManager;
    
        private Quote[] _quotes = [
            new Quote()
            {
                Message = "You cannot change what you are, only what you do.",
                Author = "Philip Pullman"
            }];
    
        public Quote? Quote { get; set; }
    
        public string GreetingMessage { get; set; }
    
        public async void OnGet()
        {
            Quote = _quotes[new Random().Next(_quotes.Length)];
    
            Variant variant = await _featureManager.GetVariantAsync("Greeting", HttpContext.RequestAborted);
    
            if (variant != null)
            {
                GreetingMessage = variant.Configuration?.Get<string>() ?? "";
            }
            else
            {
                _logger.LogWarning("No variant given. Either the feature flag named 'Greeting' is not defined or the variants are not defined properly.");
            }
        }
    }
    

    Se llama a GetVariantAsync para recuperar la variante de la marca de característica Saludo para el usuario actual y asignar su valor a la propiedad GreetingMessage del modelo de página.

  2. En QuoteOfTheDay>Páginas> Compartido>_Layout.cshtml, debajo de donde se agrega QuoteOfTheDay.styles.css, agregue la siguiente referencia a la biblioteca CSS de font-awesome.

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
    
  3. Abra index.cshtml y reemplace su contenido por el siguiente código.

    @page
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
        ViewData["Username"] = User.Identity?.Name ?? string.Empty;
    }
    
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            color: #333;
        }
    
        .quote-container {
            background-color: #fff;
            margin: 2em auto;
            padding: 2em;
            border-radius: 8px;
            max-width: 750px;
            box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2);
            display: flex;
            justify-content: space-between;
            align-items: start;
            position: relative;
        }
    
        .vote-container {
            position: absolute;
            top: 10px;
            right: 10px;
            display: flex;
            gap: 0em;
        }
    
        .vote-container .btn {
            background-color: #ffffff; /* White background */
            border-color: #ffffff; /* Light blue border */
            color: #333
        }
    
        .vote-container .btn:focus {
            outline: none;
            box-shadow: none;
        }
    
        .vote-container .btn:hover {
            background-color: #F0F0F0; /* Light gray background */
        }
    
        .greeting-content {
            font-family: 'Georgia', serif; /* More artistic font */
        }
    
        .quote-content p.quote {
            font-size: 2em; /* Bigger font size */
            font-family: 'Georgia', serif; /* More artistic font */
            font-style: italic; /* Italic font */
            color: #4EC2F7; /* Medium-light blue color */
        }
    </style>
    
    <div class="quote-container">
        <div class="quote-content">
            <h3 class="greeting-content">@(Model.GreetingMessage)</h3>
            <br />
            <p class="quote">“@(Model.Quote?.Message ?? "< Quote not found >")”</p>
            <p>- <b>@(Model.Quote?.Author ?? "Unknown")</b></p>
        </div>
    
        <div class="vote-container">
            <button class="btn btn-primary" onclick="heartClicked(this)">
                <i class="far fa-heart"></i> <!-- Heart icon -->
            </button>
        </div>
    </div>
    
    <script>
        function heartClicked(button) {
            var icon = button.querySelector('i');
            icon.classList.toggle('far');
            icon.classList.toggle('fas');
        }
    </script>
    

    Este código muestra la interfaz de usuario de la aplicación Cita del día y muestra el GreetingMessage del modelo de página. El controlador de JavaScript heartClicked se desencadena cuando se hace clic en el botón del corazón.

Compilar y ejecutar la aplicación

  1. Compile y ejecute la aplicación.

    dotnet build
    dotnet run
    
  2. Una vez cargada la aplicación, seleccione Registrar en la parte superior derecha para registrar un nuevo usuario.

    Captura de pantalla de la aplicación Cita del día, en la que se muestra Registrarse.

  3. Registre un nuevo usuario denominado usera@contoso.com.

  4. Seleccione el vínculo Haga clic aquí para validar el correo electrónico después de escribir la información del usuario.

    Recorte de pantalla de la aplicación Cita del día, que muestra cómo hacer clic para confirmar.

  5. Repita los mismos pasos para registrar un segundo usuario llamado userb@contoso.com.

    Nota:

    Es importante que este tutorial use estos nombres exactamente. Siempre que la característica se haya configurado según lo previsto, los dos usuarios deben ver variantes diferentes.

  6. Seleccione Iniciar sesión en la parte superior derecha para iniciar sesión como usera@contoso.com.

    Captura de pantalla de la aplicación Cita del día, que muestra **Inicio de sesión**.

  7. Una vez que haya iniciado sesión, verá un mensaje de saludo largo para usera@contoso.com

    Recorte de pantalla de la aplicación Cita del día, que muestra un mensaje largo para el usuario.

  8. Haga clic en Cerrar sesión e inicie sesión como userb@contoso.com, verá el mensaje de saludo sencillo.

    Recorte de pantalla de la aplicación Cita del día, que muestra un mensaje sencillo para el usuario.

Pasos siguientes

Si quiere conocer todas las características de la biblioteca de administración de características de .NET, consulte el siguiente documento.