in Architettura Software, Informatica

appsettings.json come funziona

Il file appsettings.json in ASP.NET Core è il luogo standard per la configurazione dell’applicazione, utilizzato per memorizzare impostazioni come stringhe di connessione al database, chiavi API e altre configurazioni specifiche dell’ambiente. Il suo uso principale è quello di separare il codice di programmazione dai dati di configurazione, rendendo l’applicazione più flessibile e facile da gestire in diversi ambienti (sviluppo, test, produzione).

Come funziona

Lettura della configurazione

In ASP.NET Core, la configurazione viene caricata e gestita da un sistema di provider di configurazione. Il framework legge automaticamente le impostazioni da appsettings.json (e da altri file specifici per l’ambiente come appsettings.Development.json o appsettings.Production.json), dalle variabili d’ambiente, dalla riga di comando e da altre fonti.

Il sistema di configurazione crea un’istanza di IConfiguration che rappresenta un’astrazione delle impostazioni, permettendo all’applicazione di accedervi in modo uniforme.

Utilizzo della configurazione

Le impostazioni possono essere iniettate nel codice tramite il sistema di Dependency Injection (DI). Ad esempio, è possibile iniettare l’interfaccia IConfiguration direttamente in un controller o in un servizio per accedere ai valori:

C#

public class MyController : ControllerBase
{
    private readonly IConfiguration _configuration;

    public MyController(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    [HttpGet]
    public IActionResult Get()
    {
        // Ottenere un valore
        var mySetting = _configuration["MyKey"]; 
        return Ok(mySetting);
    }
}

Un metodo più robusto e raccomandato è utilizzare la Configuration Binding (o Options Pattern), che mappa le sezioni del file di configurazione su classi C# fortemente tipizzate, migliorando la sicurezza e la leggibilità del codice.

Ad esempio, se il tuo appsettings.json contiene una sezione MySettings:

{
  "MySettings": {
    "MyKey": "Hello World",
    "MyOtherKey": 123
  }
}

Puoi creare una classe C# che la rappresenti:

public class MySettings
{
    public string MyKey { get; set; }
    public int MyOtherKey { get; set; }
}

E poi registrarla nel file Program.cs (o Startup.cs per i progetti più datati):

builder.Services.Configure<MySettings>(
    builder.Configuration.GetSection("MySettings"));

Successivamente, potrai iniettare IOptions<MySettings> ovunque nel tuo codice:

public class MyService
{
    private readonly MySettings _settings;

    public MyService(IOptions<MySettings> settings)
    {
        _settings = settings.Value;
    }
}

Ordine di caricamento

L’ordine con cui i file e i provider di configurazione vengono caricati è cruciale, poiché le impostazioni lette da una fonte successiva sovrascrivono quelle delle fonti precedenti. Questo permette di definire valori predefiniti e di personalizzarli facilmente per specifici ambienti o scopi.

L’ordine di caricamento predefinito in un’applicazione ASP.NET Core è il seguente:

  1. appsettings.json: Carica le impostazioni di base, valide per tutti gli ambienti.
  2. appsettings.[Environment].json: Sovrascrive le impostazioni di base con quelle specifiche per l’ambiente corrente (ad esempio Development, Staging, Production).
  3. Segreti dell’utente (User Secrets): Usati in ambiente di sviluppo per memorizzare segreti sensibili, come stringhe di connessione. Sovrascrivono le impostazioni di appsettings.json e appsettings.Development.json.
  4. Variabili d’ambiente: Sovrascrivono tutte le impostazioni precedenti. Questo è un metodo comune per configurare le applicazioni in ambienti di produzione come Docker o servizi cloud (es. Azure App Service, AWS).
  5. Argomenti della riga di comando: Hanno la massima priorità e sovrascrivono tutte le altre fonti.

Questo ordine di sovrascrittura garantisce che le impostazioni più specifiche e volatili (come le variabili d’ambiente) prevalgano su quelle più generali e fisse (come quelle del file appsettings.json).

In Azure App Service, il file appsettings.json viene utilizzato come base, ma le impostazioni vengono sovrascritte dalle configurazioni definite direttamente nel portale di Azure, che vengono esposte all’applicazione come variabili d’ambiente. Questo meccanismo offre una maggiore flessibilità e sicurezza per la gestione delle configurazioni specifiche dell’ambiente di produzione.


Ordine di priorità

Quando un’applicazione ASP.NET Core viene eseguita su Azure, l’ordine di caricamento e sovrascrittura delle configurazioni è cruciale. La priorità più alta spetta alle impostazioni definite nell’App Service stesso.

L’ordine con cui le impostazioni vengono lette e sovrascritte è il seguente, dalla priorità più bassa alla più alta:

  1. appsettings.json: contiene le impostazioni di base, valide per tutti gli ambienti.
  2. appsettings.[Environment].json: sovrascrive i valori di base con impostazioni specifiche per l’ambiente di deployment (ad esempio, appsettings.Production.json).
  3. Variabili d’ambiente: le impostazioni definite nell’App Service tramite il portale di Azure vengono esposte all’applicazione come variabili d’ambiente. Queste variabili hanno la priorità più alta e sovrascrivono qualsiasi valore presente nei file appsettings.json.

Inoltre, è importante considerare il formato dei nomi delle variabili:

  • Per le chiavi annidate, come "ConnectionStrings": { "DefaultConnection": "..." }, Azure converte il delimitatore : in un doppio underscore __. Quindi, nel portale di Azure, la chiave andrebbe configurata come ConnectionStrings__DefaultConnection.

Vantaggi in Azure

L’uso delle impostazioni dell’App Service offre numerosi vantaggi:

  • Sicurezza: i segreti, come le stringhe di connessione o le chiavi API, non vengono memorizzati direttamente nel codice sorgente e non vengono committati nel repository, riducendo il rischio di esposizione.
  • Flessibilità: è possibile modificare le configurazioni dell’ambiente di produzione senza dover ricompilare o ridistribuire l’applicazione.
  • Separazione degli ambienti: ogni ambiente (sviluppo, staging, produzione) può avere le proprie impostazioni uniche, gestite in modo centralizzato e sicuro nel portale di Azure.

Per scenari più complessi o per la gestione di un gran numero di configurazioni condivise tra più servizi, Azure offre anche il servizio Azure App Configuration, che consente di centralizzare la gestione della configurazione e integrarla con Azure Key Vault per una sicurezza ancora maggiore.