Reading appsettings.json and Environment Variables in .NET 3.1

Goal

Read configuration from appsettings.json files and environment variables in .NET 3.1 console apps and Web APIs.

Setup

Install required packages:

dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.FileExtensions
dotnet add package Microsoft.Extensions.Configuration.Json

Create appsettings.json:

{
    "Settings": {
        "Params": {
            "Param1": "value 1",
            "Param2": "value 2"
        }
    }
}

Console Application

Load configuration in Program.cs:

var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

IConfiguration configuration = builder.Build();

Access values:

var param1 = configuration.GetSection("Settings").GetValue<string>("Params:Param1");

Web API

Configure in Program.cs:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, configBuilder) => 
            {
                configBuilder
                    .AddJsonFile("appsettings.json", optional: false)
            }
        )
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Inject IConfiguration into controllers:

[Route("[controller]")]
[ApiController]
public class HealthController : ControllerBase
{
    private readonly IConfiguration _configuration;

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

Multiple Configuration Sources

When multiple sources contain the same key, last source wins.

Console Application

Install environment variables package:

dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables

Chain multiple sources:

var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile("appsettings.secrets.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();

Web API Environment-Specific Settings

Load settings based on ASPNETCORE_ENVIRONMENT:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, configBuilder) => 
            {
                configBuilder
                    .AddJsonFile("appsettings.json", optional: false)
                    .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true);
            }
        )
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });