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 .NET Configurazione app è 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:

  • Configurare il servizio in background .NET per aggiornarne la configurazione in risposta alle modifiche in un archivio Configurazione app.
  • 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 della 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
    

Ricaricare i dati di Configurazione app

  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 app usando Microsoft Entra ID (scelta consigliata) o un stringa di connessione.

    Usare per eseguire l'autenticazione DefaultAzureCredential nell'archivio Configurazione app. Seguire le istruzioni per assegnare le credenziali al ruolo 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:`.
            .Select("TestApp:*")
            // Configure to reload the key 'TestApp:Settings:Message' if it is modified.
            .ConfigureRefresh(refreshOptions =>
            {
                refreshOptions.Register("TestApp:Settings:Message");
            });
    
        // 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
    // ... ...
    

    ConfigureRefresh Nel metodo viene registrata una chiave all'interno dell'archivio Configurazione app per il monitoraggio delle modifiche. Il Register metodo dispone di un parametro refreshAll booleano facoltativo che può essere usato per indicare se tutti i valori di configurazione devono essere aggiornati se la chiave registrata cambia. In questo esempio verrà aggiornata solo la chiave TestApp:Settings:Message . Tutte le impostazioni registrate per l'aggiornamento hanno una scadenza della cache predefinita di 30 secondi prima del tentativo di un nuovo aggiornamento. Questo valore può essere aggiornato chiamando il metodo AzureAppConfigurationRefreshOptions.SetCacheExpiration.

  5. Aprire Worker.cs. IConfiguration Inserire e IConfigurationRefresher al Worker servizio 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 in cui si considera attiva l'applicazione TryRefreshAsync . Ad esempio, può essere quando si elabora un messaggio in arrivo, un ordine o un'iterazione di un'attività complessa. Può anche essere in un timer se l'applicazione è attiva sempre. 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 è trascorsa la scadenza della cache configurata e la TryRefreshAsync chiamata viene attivata di nuovo dall'attività dell'applicazione. La chiamata TryRefreshAsync è un'operazione no-op prima della scadenza della cache configurata, quindi l'impatto sulle prestazioni è minimo, anche se viene chiamato 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 Configurazione app disponibile in Panoramica dell'archivio 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. Nella portale di Azure passare a Esplora configurazione dell'archivio Configurazione app e aggiornare il valore della chiave seguente.

    Chiave valore
    TestApp:Settings:Message Dati della configurazione di app Azure - Aggiornato
  6. Attendere alcuni istanti per permettere alla finestra del tempo dell’intervallo di aggiornamento di passare. 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 è stato 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: