ASP.NET Core Reading Configuration Values Step by step Implementation and Top 10 Questions and Answers
 Last Update: April 01, 2025      16 mins read      Difficulty-Level: beginner

ASP.NET Core Reading Configuration Values

ASP.NET Core offers a robust and flexible configuration system that simplifies the process of reading configuration values from various sources such as JSON files, environment variables, command-line arguments, and more. Understanding how to read and utilize these configuration values is crucial for building dynamic and maintainable applications. In this article, we will delve into the ASP.NET Core configuration system, explore its key components, and provide examples of how to effectively read configuration values.

Overview of the Configuration System

At the core of ASP.NET Core's configuration system is the IConfiguration interface. This interface provides a unified API for accessing configuration settings, abstracting away the underlying storage format. The configuration system is extensible, allowing developers to use or create custom configuration providers tailored to their specific requirements.

Configuration Sources

ASP.NET Core supports a variety of configuration sources, which can be combined in a flexible manner. Some common configuration sources include:

  1. JSON Files: Typically used for storing structured configuration data. The appsettings.json file is the primary JSON configuration file in ASP.NET Core projects.
  2. XML and INI Files: While less common than JSON, ASP.NET Core also supports XML and INI file formats.
  3. Environment Variables: Useful for storing sensitive information or environment-specific settings.
  4. Command-Line Arguments: Can override configuration values set in other sources.
  5. Azure Key Vault: Ideal for managing sensitive data in cloud applications.
  6. Custom Configuration Providers: Developers can create custom providers to read configuration data from databases, memory, or any other source.

Setting Up Configuration

In modern ASP.NET Core projects that use the default project template, the configuration setup is largely automated during the application startup process. This typically involves:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

The CreateDefaultBuilder method sets up the default configuration, which includes:

  • appsettings.json
  • appsettings.{Environment}.json (e.g., appsettings.Development.json)
  • User Secrets (during development)
  • Environment variables
  • Command-line arguments

These sources are combined into a hierarchical structure, where later sources can override values provided by earlier ones.

Accessing Configuration Values

Once the configuration system is set up, you can access configuration values through dependency injection (DI) by injecting the IConfiguration interface into your classes.

public class MyService
{
    private readonly IConfiguration _configuration;

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

    public void DoWork()
    {
        var myValue = _configuration["MySection:MyKey"];
        // Use myValue
    }
}

Alternatively, you can use the ConfigurationBinder to bind configuration sections to strongly-typed objects.

public class MyConfig
{
    public string MyKey { get; set; }
}

public class MyService
{
    private readonly MyConfig _config;

    public MyService(IConfiguration configuration)
    {
        _config = new MyConfig();
        configuration.GetSection("MySection").Bind(_config);
    }

    public void DoWork()
    {
        var myValue = _config.MyKey;
        // Use myValue
    }
}

For convenience, you can also use options pattern to simplify strongly-typed configuration access.

// Register the configuration in Startup.cs or Program.cs
services.Configure<MyConfig>(configuration.GetSection("MySection"));

public class MyService
{
    private readonly IOptions<MyConfig> _config;

    public MyService(IOptions<MyConfig> config)
    {
        _config = config;
    }

    public void DoWork()
    {
        var myValue = _config.Value.MyKey;
        // Use myValue
    }
}

Practical Example

Consider a simple ASP.NET Core application that reads a connection string and other configuration settings from appsettings.json.

appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
  },
  "AppSettings": {
    "FeatureToggle": true,
    "LoggingLevel": "Information"
  }
}

Service Class:

public class DatabaseService
{
    private readonly IConfiguration _configuration;

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

    public void Connect()
    {
        var connectionString = _configuration.GetConnectionString("DefaultConnection");
        // Use connectionString to connect to the database
    }
}

public class AppSettings
{
    public bool FeatureToggle { get; set; }
    public string LoggingLevel { get; set; }
}

public class LoggingService
{
    private readonly AppSettings _settings;

    public LoggingService(IOptions<AppSettings> settings)
    {
        _settings = settings.Value;
    }

    public void Log(string message)
    {
        if (_settings.FeatureToggle)
        {
            Console.WriteLine($"[{_settings.LoggingLevel}]: {message}");
        }
    }
}

Startup Configuration:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    // Register the configuration
    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

    // Register services
    services.AddTransient<DatabaseService>();
    services.AddTransient<LoggingService>();
}

Best Practices

  1. Use Strongly Typed Settings: Binding configuration sections to strongly-typed objects improves code maintainability and reduces runtime errors.
  2. Secure Sensitive Data: Avoid hardcoding sensitive information in configuration files. Use environment variables or secrets management tools to protect your application's secrets.
  3. Use Environment-Specific Settings: Differentiate between development, testing, and production settings by using environment-specific configuration files.
  4. Validate Configuration: Implement validation logic to ensure that required configuration values are present and valid.
  5. Document Configuration Settings: Clearly document the purpose and expected values of configuration settings to facilitate maintenance and onboarding.

Conclusion

ASP.NET Core's configuration system provides a powerful and flexible framework for managing application settings. By leveraging built-in configuration providers, you can easily read and utilize configuration values from various sources. Utilizing strongly-typed options patterns and best practices can further enhance your application's maintainability and security. Whether you're developing a small web application or a large enterprise system, understanding how to effectively read and utilize configuration values is a key skill in building robust, adaptable applications.

Examples, Set Route and Run the Application: Step-by-Step for Beginners in ASP.NET Core Reading Configuration Values

As a beginner in ASP.NET Core, one foundational task is understanding how to read configuration values. ASP.NET Core has a built-in configuration system that supports a variety of configuration sources, such as JSON files, XML files, environment variables, command-line arguments, and more. In this guide, we'll walk through setting up a basic ASP.NET Core application, configuring routes, and implementing configuration reading step-by-step.

Step 1: Set Up Your ASP.NET Core Project

To start, you need to create a new ASP.NET Core project. You can do this using the .NET CLI or Visual Studio.

Using .NET CLI:

  1. Open your terminal or command prompt.

  2. Navigate to the directory where you want to create your project.

  3. Run the following command to create a new ASP.NET Core web application:

    dotnet new web -n ConfigDemo
    
  4. Navigate into the project directory:

    cd ConfigDemo
    

Using Visual Studio:

  1. Open Visual Studio and select "Create a new project."
  2. Choose "ASP.NET Core Web Application" and click "Next."
  3. Name your project, e.g., "ConfigDemo," and click "Create."
  4. On the next screen, select "Web Application (Model-View-Controller)" and ensure the .NET Core SDK is selected, and click "Create."

Step 2: Understand the Default Configuration

By default, ASP.NET Core applications use a configuration system that primarily involves a appsettings.json file.

  1. Open appsettings.json in your project.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
  2. Create Custom Configuration Section:

    You can add your own configuration sections to this file. For example, let's add a Settings section.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*",
      "Settings": {
        "ServiceName": "MyAwesomeService",
        "MaxUsers": 150
      }
    }
    

Step 3: Inject Configuration into Your Application

  1. Open Startup.cs (in .NET Core 3.1 or earlier) or Program.cs (in .NET 5 or later).

  2. Configure Services and Routing:

    • In .NET Core 3.1 or earlier:

      public class Startup
      {
          public IConfiguration Configuration { get; }
      
          public Startup(IConfiguration configuration)
          {
              Configuration = configuration;
          }
      
          public void ConfigureServices(IServiceCollection services)
          {
              services.AddControllersWithViews();
          }
      
          public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
          {
              if (env.IsDevelopment())
              {
                  app.UseDeveloperExceptionPage();
              }
              else
              {
                  app.UseExceptionHandler("/Home/Error");
                  app.UseHsts();
              }
              app.UseHttpsRedirection();
              app.UseStaticFiles();
      
              app.UseRouting();
      
              app.UseAuthorization();
      
              app.UseEndpoints(endpoints =>
              {
                  endpoints.MapControllerRoute(
                      name: "default",
                      pattern: "{controller=Home}/{action=Index}/{id?}");
              });
          }
      }
      
    • In .NET 5 or later:

      var builder = WebApplication.CreateBuilder(args);
      
      // Add services to the container.
      builder.Services.AddControllersWithViews();
      
      var app = builder.Build();
      
      // Configure the HTTP request pipeline.
      if (!app.Environment.IsDevelopment())
      {
          app.UseExceptionHandler("/Home/Error");
          app.UseHsts();
      }
      
      app.UseHttpsRedirection();
      app.UseStaticFiles();
      
      app.UseRouting();
      
      app.UseAuthorization();
      
      app.MapControllerRoute(
          name: "default",
          pattern: "{controller=Home}/{action=Index}/{id?}");
      
      app.Run();
      
  3. Create a Controller to Use Configuration:

    • Create a new controller named SettingsController. This can be done either via the .NET CLI or through Visual Studio.

    • For the CLI:

      dotnet new controller -n SettingsController
      
    • Implement the SettingsController to read configuration values.

      using Microsoft.AspNetCore.Mvc;
      using Microsoft.Extensions.Configuration;
      
      public class SettingsController : Controller
      {
          private readonly IConfiguration _configuration;
      
          public SettingsController(IConfiguration configuration)
          {
              _configuration = configuration;
          }
      
          public IActionResult Index()
          {
              var serviceName = _configuration["Settings:ServiceName"];
              var maxUsers = _configuration.GetValue<int>("Settings:MaxUsers");
      
              ViewBag.ServiceName = serviceName;
              ViewBag.MaxUsers = maxUsers;
      
              return View();
          }
      }
      
  4. Create a View for the Settings Page:

    • Create a new view Index.cshtml inside the Views/Settings folder.

    • Add the following content to display the configuration values.

      @{
          ViewData["Title"] = "Settings";
      }
      
      <h2>Settings</h2>
      <p>Service Name: @ViewBag.ServiceName</p>
      <p>Max Users: @ViewBag.MaxUsers</p>
      

Step 4: Set the Route

To access the SettingsController, ensure the routing is correctly set up to allow access to /Settings.

You've already set up the default controller route:

endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

This route allows you to access SettingsController by navigating to /Settings in your web browser.

Step 5: Run Your Application

  1. Run the Application:

    • In the terminal, navigate to your project directory and run:

      dotnet run
      
    • In Visual Studio, click the "Start" button.

  2. Navigate to the Settings Page:

    • Once your application is running, open a web browser and navigate to https://localhost:<port>/Settings.

    You should see the configuration values you defined in appsettings.json.

Conclusion

In this guide, we walked through creating an ASP.NET Core application, defining a custom configuration section in appsettings.json, injecting configuration into a controller, setting up the route for the controller, and running the application. This foundational knowledge will help you manage your application's configuration effectively as you build more complex projects. Keep experimenting with different configuration sources like environment variables, Azure Key Vault, and more to gain a deeper understanding of ASP.NET Core's configuration system.

Top 10 Questions and Answers on ASP.NET Core Reading Configuration Values

ASP.NET Core introduces a new, more flexible and powerful configuration system. It allows developers to inject configuration values into their application from various sources without changing the application code. Here are ten frequently asked questions about reading configuration values in ASP.NET Core.

1. How Do You Set Up Configuration in ASP.NET Core?

In ASP.NET Core, configuration is typically set up in the Program.cs file using the WebApplicationBuilder class. Here's an example:

var builder = WebApplication.CreateBuilder(args);

// Add configuration sources
builder.Configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                   .AddEnvironmentVariables();

var app = builder.Build();

// Use configuration
var myConfigValue = builder.Configuration["MyConfigKey"];

The AddJsonFile method adds appsettings.json to the configuration system. The AddEnvironmentVariables method allows the application to use environment variables to override configuration settings. Configuration options such as optional and reloadOnChange provide flexibility.

2. Can I Use Configuration Values Before Building the Web Application?

Yes, you can use configuration values before building the web application, but it depends on when you need the values. Typically, if you need configuration values during the setup phase, you can use the WebApplicationBuilder object to access them:

var builder = WebApplication.CreateBuilder(args);

// Access configuration values early
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");

// Continue setting up the WebApplication
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));

var app = builder.Build();

3. How Do You Access Configuration Values in Controllers or Services?

To access configuration values in controllers or services, inject IConfiguration into the constructor:

public class MyController : ControllerBase
{
    private readonly IConfiguration _configuration;

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

    public IActionResult Get()
    {
        var configValue = _configuration["MyConfigKey"];

        // Do something with the configuration value
        return Ok(configValue);
    }
}

public class MyService
{
    private readonly IConfiguration _configuration;

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

    public void DoWork()
    {
        var dbConnection = _configuration["Database:Connection"];
        // Use dbConnection for data operations
    }
}

ASP.NET Core's DI container manages IConfiguration automatically.

4. What Are the Different Ways to Store Configuration Values?

ASP.NET Core supports multiple configuration providers:

  • appsettings.json and appsettings.{Environment}.json: These JSON files are the default configuration sources and are suitable for all environments.
  • Environment Variables: Useful for production settings, environment variables are a secure way to store sensitive information.
  • Command-Line Arguments: For debugging or temporary configuration changes, command-line arguments can override other settings.
  • Memory: For testing purposes, you can use in-memory configuration providers.
  • Azure Key Vault: For cloud-hosted applications, Azure Key Vault provides a secure way to store and manage configuration secrets.

5. How Do You Handle Configuration Values with Multiple Hierarchies?

ASP.NET Core supports hierarchical configurations, which can be accessed using colon-separated keys:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "Microsoft.AspNetCore": "Error"
    }
  },
  "Database": {
    "Connection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
  }
}

Access these values as follows:

var logLevel = configuration["Logging:LogLevel:Default"];
var dbConnection = configuration["Database:Connection"];

6. How Do You Bind Configuration Sections to Objects?

Binding configuration sections to POCO objects simplifies configuration management:

public class MyConfig
{
    public string Name { get; set; }
    public int Version { get; set; }
    public Logging Logging { get; set; }
}

public class Logging
{
    public Dictionary<string, string> LogLevel { get; set; }
}

Bind the configuration section to the MyConfig object:

var myConfig = builder.Configuration.GetSection("MyConfig").Get<MyConfig>();

Ensure that the section name in GetSection matches the JSON structure.

7. How Do You Validate Configuration Values?

You can use model validation attributes to validate configuration values:

public class Settings
{
    [Required]
    public string ServiceUrl { get; set; }

    [Range(1, 100)]
    public int Timeout { get; set; }
}

Validate the configuration values:

var settings = builder.Configuration.GetSection("Settings").Get<Settings>();
var results = new List<ValidationResult>();
var context = new ValidationContext(settings, null, null);

if (!Validator.TryValidateObject(settings, context, results, true))
{
    // Handle validation errors
}

Alternatively, you can use DataAnnotationsValidator with IValidatableObject for more complex validation scenarios.

8. How Do You Use Configuration in Unit Tests?

In unit tests, you can use ConfigurationBuilder to create an IConfiguration instance with test data:

public class MyTests
{
    public IConfiguration Configuration { get; }

    public MyTests()
    {
        var builder = new ConfigurationBuilder()
            .AddInMemoryCollection(new Dictionary<string, string>
            {
                { "MyConfigKey", "MyConfigValue" }
            });

        Configuration = builder.Build();
    }

    [Fact]
    public void TestSomething()
    {
        var myConfigValue = Configuration["MyConfigKey"];
        // Assert
    }
}

9. How Can You Securely Store Sensitive Configuration Values?

Using environment variables or Azure Key Vault is recommended for storing sensitive information. Here's how you can use environment variables:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "Microsoft.AspNetCore": "Error"
    }
  },
  "Database": {
    "Connection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;"
  }
}

Override the Database:Connection value:

export Database__Connection="Server=testServerAddress;Database=testDataBase;User Id=testUsername;Password=testPassword;"

In production, consider using Azure Key Vault:

builder.Configuration.AddAzureKeyVault(new Uri("https://your-keyvault-name.vault.azure.net"),
                                        new DefaultAzureCredential());

10. What Are Best Practices for Managing Configuration in ASP.NET Core?

  1. Use Environment-Specific Configuration Files: Maintain separate appsettings.{Environment}.json files for development, testing, and production environments.
  2. Store Sensitive Information Securely: Use environment variables or Azure Key Vault for sensitive data.
  3. Validate Configuration Values: Perform validation to ensure that configuration values meet expected formats and constraints.
  4. Document Configuration Requirements: Clearly define configuration requirements and document them for ease of maintenance.
  5. Use Configuration Binding: Bind configuration sections to POCO objects to simplify access and management of configuration values.

By following these practices, you can effectively manage configuration in ASP.NET Core applications, ensuring maintainability, security, and flexibility.