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
- Un account Azure con una sottoscrizione attiva. Crearne una gratuitamente.
- Un Archivio di configurazione app. Creare un archivio.
- .NET SDK 6.0 o versione successiva , disponibile anche in Azure Cloud Shell.
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.
Creare una nuova cartella per il progetto.
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
Aggiungere riferimenti al pacchetto NuGet
Microsoft.Extensions.Configuration.AzureAppConfiguration
eseguendo il comando seguente:dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
Eseguire il comando seguente per ripristinare i pacchetti per il progetto:
dotnet restore
Aprire Program.cs e aggiungere le istruzioni seguenti:
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.AzureAppConfiguration;
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. IlRegister
metodo dispone di un parametrorefreshAll
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 metodoAzureAppConfigurationRefreshOptions.SetCacheExpiration
.Aprire Worker.cs.
IConfiguration
Inserire eIConfigurationRefresher
alWorker
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 ilTryRefreshAsync
metodo dall'interfacciaIConfigurationRefresher
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'applicazioneTryRefreshAsync
. 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 chiamaTryRefreshAsync
ogni volta che viene eseguito il servizio in background. Si noti che, anche se la chiamataTryRefreshAsync
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 laTryRefreshAsync
chiamata viene attivata di nuovo dall'attività dell'applicazione. La chiamataTryRefreshAsync
è 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
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>'
Eseguire il comando seguente per compilare l'app.
dotnet build
Al termine della compilazione, eseguire il comando seguente per eseguire l'app in locale.
dotnet run
Nella console dovrebbero essere visualizzati gli output seguenti.
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 Attendere alcuni istanti per permettere alla finestra del tempo dell’intervallo di aggiornamento di passare. Verranno visualizzati gli output della console modificati.
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.
- Accedere al portale di Azure e selezionare Gruppi di risorse.
- Nella casella Filtra per nome immettere il nome del gruppo di risorse.
- Nell'elenco dei risultati selezionare il nome del gruppo di risorse per visualizzare una panoramica.
- Selezionare Elimina gruppo di risorse.
- 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: