skip to Main Content

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.

3

Answers


  1. 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

    Login or Signup to reply.
  2. 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
    Login or Signup to reply.
  3. I figured out how to access appsettings.json from controller using IConfiguration interface inside the constructor.

    below my example of code:

    public class HomeController : Controller
    {
    
            private readonly IConfiguration _config;
            private string ConnectionString;
    
            public HomeController(IConfiguration configuration)
            {
                _config = configuration;
                ConnectionString = _config["Configurations:ConnectionString"];
                Console.WriteLine(ConnectionString);
            }
    

    The connection String (in this case was the parameter inside json file) showed successfully!
    my appsettings.json code:

    "Configurations": {
        "ConnectionString": "MyDBConnectionStringExample;"
      }
    

    I really recommend that you will need a separated class to handle all the database communication if it’s the case, otherwise it work’s well… hope it helps someone.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search