Condividi tramite


Esercitazione: usare la configurazione dinamica in un servizio in background .NET

I dati di Configurazione app possono essere caricati come impostazioni dell'app in un'applicazione .NET. Per altre informazioni, vedere la guida introduttiva. Tuttavia, come è progettato da .NET, le impostazioni dell'app possono essere aggiornate solo al riavvio dell'applicazione. Il provider App Configuration .NET è una libreria .NET Standard. Supporta la memorizzazione nella cache e l'aggiornamento della configurazione in modo dinamico senza il riavvio dell'applicazione. Questa esercitazione illustra come implementare gli aggiornamenti della configurazione dinamica in un servizio in background .NET.

In questa esercitazione apprenderai a:

  • Imposta il servizio di background .NET per aggiornare la sua configurazione in risposta alle modifiche nello store di App Configuration.
  • Usare la configurazione più recente nel servizio in background.

Prerequisiti

Aggiungere un valore chiave

Aggiungere il valore chiave seguente all’archivio di Configurazione app e lasciare Etichetta e Tipo di contenuto con i valori predefiniti. Per altre informazioni su come aggiungere valori chiave a un archivio usando il portale di Azure o l’interfaccia della riga di comando, andare a Creare un valore chiave.

Chiave Valore
TestApp:Settings:Message Dati di Configurazione app di Azure

Creare un servizio in background .NET

Usare l'interfaccia a riga di comando di .NET per creare un nuovo progetto di app .NET. Il vantaggio dell'uso dell'interfaccia della riga di comando di .NET su Visual Studio è che è disponibile nelle piattaforme Windows, macOS e Linux. In alternativa, usare gli strumenti preinstallati disponibili in Azure Cloud Shell.

  1. Creare una nuova cartella per il progetto.

  2. Nella nuova cartella eseguire il comando seguente per creare un nuovo progetto di servizio in background .NET:

    dotnet new worker
    

Ricarica i dati dalla configurazione dell'applicazione

  1. Aggiungere riferimenti al pacchetto NuGet Microsoft.Extensions.Configuration.AzureAppConfiguration eseguendo il comando seguente:

    dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
    
  2. Eseguire il comando seguente per ripristinare i pacchetti per il progetto:

    dotnet restore
    
  3. Aprire Program.cs e aggiungere le istruzioni seguenti:

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    
  4. Connettersi a Configurazione dell'app usando Microsoft Entra ID (scelta consigliata) o una stringa di connessione.

    Usare DefaultAzureCredential per eseguire l'autenticazione nell'archivio di Configurazione app. Segui le istruzioni per assegnare la tua credenziale al ruolo di Lettore Dati Configurazione App. Assicurarsi di consentire tempo sufficiente per la propagazione dell'autorizzazione prima di eseguire l'applicazione.

    // Existing code in Program.cs
    // ... ...
    
    var builder = Host.CreateApplicationBuilder(args);
    
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        string endpoint = Environment.GetEnvironmentVariable("Endpoint"); 
        options.Connect(new Uri(endpoint), new DefaultAzureCredential());
            // Load all keys that start with `TestApp:` and have no label.
            .Select("TestApp:*")
            // Reload configuration if any selected key-values have changed.
            .ConfigureRefresh(refreshOptions =>
            {
                refreshOptions.RegisterAll();
            });
    
        // Register the refresher so that the Worker service can consume it through DI
        builder.Services.AddSingleton(options.GetRefresher());
    });
    
    // The rest of existing code in Program.cs
    // ... ...
    

    All'interno del ConfigureRefresh metodo si chiama il RegisterAll metodo per indicare al provider di Configurazione app di ricaricare l'intera configurazione ogni volta che rileva una modifica in uno dei valori chiave selezionati (quelli che iniziano con TestApp: e non hanno etichetta). Per altre informazioni sul monitoraggio delle modifiche alla configurazione, vedere Procedure consigliate per l'aggiornamento della configurazione.

    Suggerimento

    È possibile aggiungere una chiamata al refreshOptions.SetRefreshInterval metodo per specificare il tempo minimo tra gli aggiornamenti della configurazione. In questo esempio si usa il valore predefinito di 30 secondi. Impostare un valore superiore se è necessario ridurre il numero di richieste effettuate nell'archivio di Configurazione app.

  5. Aprire Worker.cs. Inserire IConfiguration e IConfigurationRefresher al servizio Worker e registrare i dati di configurazione da Configurazione app.

    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;
        private readonly IConfiguration _configuration;
        private readonly IConfigurationRefresher _refresher;
    
        public Worker(ILogger<Worker> logger, IConfiguration configuration, IConfigurationRefresher refresher)
        {
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
            _refresher = refresher ?? throw new ArgumentNullException(nameof(refresher));
        }
    
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                // Intentionally not await TryRefreshAsync to avoid blocking the execution.
                _refresher.TryRefreshAsync(stoppingToken);
    
                if (_logger.IsEnabled(LogLevel.Information))
                {
                    _logger.LogInformation(_configuration["TestApp:Settings:Message"] ?? "No data.");
                }
    
                await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
            }
        }
    }
    

    La chiamata al ConfigureRefresh metodo da solo non causerà l'aggiornamento automatico della configurazione. Chiamare il TryRefreshAsync metodo dall'interfaccia IConfigurationRefresher per attivare un aggiornamento. Questa progettazione consiste nell'evitare richieste inviate a Configurazione app anche quando l'applicazione è inattiva. È possibile includere la chiamata TryRefreshAsync in cui si considera attiva l'applicazione. Ad esempio, può essere quando si elabora un messaggio in arrivo, un ordine o un'iterazione di un'attività complessa. Può avvenire anche all'interno di un timer se l'applicazione è sempre attiva. In questo esempio si chiama TryRefreshAsync ogni volta che viene eseguito il servizio in background. Si noti che, anche se la chiamata TryRefreshAsync non riesce per qualsiasi motivo, l'applicazione continuerà a usare la configurazione memorizzata nella cache. Verrà eseguito un altro tentativo quando l'intervallo di aggiornamento configurato è passato e la TryRefreshAsync chiamata viene attivata di nuovo dall'attività dell'applicazione. La chiamata a TryRefreshAsync è un no-op prima che l'intervallo di aggiornamento configurato sia trascorso, quindi l'impatto sulle prestazioni è minimo, anche se viene effettuata di frequente.

Compilare ed eseguire l'app in locale

  1. Impostare una variabile di ambiente.

    Impostare la variabile di ambiente denominata Endpoint sull'endpoint dell'archivio di Configurazione app disponibile in Informazioni generali dello store nel portale di Azure.

    Se si usa il prompt dei comandi di Windows, eseguire il comando seguente e riavviare il prompt per rendere effettiva la modifica:

    setx Endpoint "<endpoint-of-your-app-configuration-store>"
    

    Se si usa PowerShell, eseguire il comando seguente:

    $Env:Endpoint = "<endpoint-of-your-app-configuration-store>"
    

    Se si usa macOS o Linux, eseguire il comando seguente:

    export Endpoint='<endpoint-of-your-app-configuration-store>'
    
  2. Eseguire il comando seguente per compilare l'app.

    dotnet build
    
  3. Al termine della compilazione, eseguire il comando seguente per eseguire l'app in locale.

    dotnet run
    
  4. Nella console dovrebbero essere visualizzati gli output seguenti.

    Screenshot del servizio in background.

  5. Nel portale di Azure passare a Explorer configurazione dell'archivio di Configurazione app e aggiornare il valore della chiave seguente.

    Chiave Valore
    TestApp:Settings:Message Dati della configurazione di app Azure - Aggiornato
  6. Attendere pochi momenti affinché passi la finestra di intervallo di aggiornamento. Verranno visualizzati gli output della console modificati.

    Screenshot del servizio in background aggiornato.

Pulire le risorse

Se non si vuole continuare a usare le risorse create in questo articolo, eliminare il gruppo di risorse creato qui per evitare addebiti.

Importante

L'eliminazione di un gruppo di risorse è irreversibile. Il gruppo di risorse e tutte le risorse in esso contenute vengono eliminati in modo permanente. Assicurarsi di non eliminare accidentalmente il gruppo di risorse o le risorse sbagliate. Se le risorse per questo articolo sono state create in un gruppo di risorse che contiene altre risorse che si vogliono mantenere, eliminare ogni risorsa singolarmente dal rispettivo riquadro anziché eliminare il gruppo di risorse.

  1. Accedere al portale di Azure e selezionare Gruppi di risorse.
  2. Nella casella Filtra per nome immettere il nome del gruppo di risorse.
  3. Nell'elenco dei risultati selezionare il nome del gruppo di risorse per visualizzare una panoramica.
  4. Selezionare Elimina gruppo di risorse.
  5. Verrà chiesto di confermare l'eliminazione del gruppo di risorse. Immettere il nome del gruppo di risorse per confermare e selezionare Elimina.

Dopo qualche istante, il gruppo di risorse e tutte le risorse che contiene vengono eliminati.

Passaggi successivi

In questa esercitazione, hai abilitato il servizio in background .NET per aggiornare dinamicamente le impostazioni di configurazione da Configurazione App. Per informazioni su come abilitare la configurazione dinamica in un'applicazione Web ASP.NET, passare all'esercitazione successiva:

Per informazioni su come usare un'identità gestita di Azure per semplificare l'accesso a Configurazione app, continuare con l'esercitazione successiva: