How to access a value from appsettings.json in ASP.NET Core 6 controller

Viewed 412

I have created a brand new ASP.NET Core Web API project (.NET 6) from the default template provided in Visual Studio 2022. After that I added a config key in the appsettings.json file and am trying to access it inside the controller class, but can't.

My appsettings.json file is below:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ProjectName" : "VeryFunny"
}

The controller code is below:

public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly IConfiguration _configuration;

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

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = _configuration["ProjectName"] // <-- I added this
        })
        .ToArray();
    }
}

I receive null instead of VeryFunny string in the above method, where I have added an arrow comment. I assumed that after the merging of Startup.cs class and Program.cs class in .NET 6, IConfiguration is easily available now, but it seems I was wrong.

UPDATE:

This is a bare bone project you get when you create a new ASP.NET Core Web API targeting .NET 6, in Visual Studio 2022. When I create a new project targeting .NET 5, I have no issues because in that Startup.cs and Porgram.cs are separate classes and an instance of IConfiguration is already injected in Startup class, whereas this is not the case in .NET 6. There is an existing SO question which asks the same question but that question and its answers are focused on .NET implementations prior to .NET 6, for example .NET Core 2.x, .NET 5 etc. Mine is .NET 6 specific.

2 Answers

You will need to use .GetValue<type>, so try

Summary = _configuration.GetValue<string>("ProjectName");

You can also check detailed posts https://stackoverflow.com/a/58432834/3559462 (shows how to get value)

https://qawithexperts.com/article/asp-net/read-values-from-appsettingsjson-in-net-core/467 (Shows binding of Model from appsettings.json)

Update:

I created new .NET Core 6 API project and used this code

  private readonly IConfiguration _configuration;
    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuratio)
    {
        _logger = logger;
        _configuration = configuratio;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = _configuration.GetValue<string>("ProjectName")

    })
        .ToArray();

It worked for me, here is the GIF image

enter image description here

These options maybe helpful:

  1. Maybe your appsettings.json file is not copied on the building. Right click on appsettings.json file and select properties. then Copy to Output Directory should be equal to Copy if newer or Copy always.
  2. If you have multiple appsettings like appsettings.json, appsettings.Development.json, appsettings.Production.json. Be sure your key(ProjectName) is in all of them
Related