如何在 ASP.NET Core 6 控制器中访问 appsettings.json 中的值

6
我已经从Visual Studio 2022提供的默认模板中创建了一个全新的ASP.NET Core Web API项目(.NET 6)。之后,我在appsettings.json文件中添加了一个配置键,并尝试在controller类内部访问它,但是无法访问。
我的appsettings.json文件如下:
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ProjectName" : "VeryFunny"
}


控制器代码如下:
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();
    }
}

在上述方法中,我收到了null而不是VeryFunny字符串,这是一个箭头注释。我认为在.NET 6中合并Startup.cs类和Program.cs类之后,IConfiguration现在很容易获得,但似乎我错了。
更新:
这是在Visual Studio 2022中创建新的ASP.NET Core Web API 针对.NET 6时得到的裸骨项目。当我创建一个针对.NET 5的新项目时,我没有任何问题,因为在那个项目中,Startup.csPorgram.cs是分开的类,并且Startup类中已经注入了IConfiguration实例,然而在.NET 6中却不是这样。有一篇现有的SO问题问同样的问题,但该问题及其答案集中于.NET 6之前的.NET实现,例如.NET Core 2.x、.NET 5等。我的问题是.NET 6特定的。

这里有一些有用的信息:https://dev59.com/fVwZ5IYBdhLWcg3wb_-Y#67292524 - 注意:在这种情况下,他们会将自定义属性放在 AppSettings 父元素下;而你的 ProjectName 则位于根目录下... 根据惯例,你会想要将其嵌套在 AppSettings 下面,但是也可以在没有它的情况下通过编程方式访问它。 - JohnLBevan
请查看文档 - Guru Stron
1
这个回答解决了你的问题吗? .NET Core中从appsettings.json获取值 - Manish
@Manish 不是的。我更新了我的问题,使其更具体。 - user419022
你修改过 Program.cs 中的代码吗?我使用了你的代码,在 .net 6 中运行良好。 - Ruikai Feng
同样的代码对我来说可以正常工作,除了你提到的更改之外没有其他更改。现在请告诉我们您在 program.cs 中做了哪些更改。 - CodingMytra
3个回答

6
我发现可以在控制器中使用构造函数和IConfiguration接口来访问appsettings.json文件。
以下是我的代码示例:
public class HomeController : Controller
{

        private readonly IConfiguration _config;
        private string ConnectionString;

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

连接字符串(在本例中是json文件内的参数)已成功显示!我的appsettings.json代码:
"Configurations": {
    "ConnectionString": "MyDBConnectionStringExample;"
  }

如果需要的话,我强烈建议你使用一个单独的类来处理所有数据库通信,否则它可以很好地工作……希望能帮助到某些人。


这是一个非常棒的答案。正是我所需要的。谢谢你写下这个。不知道如何在我的控制器中获取配置项的值。 - raddevus
1
非常感谢您留下反馈,我很高兴能够帮助。@raddevus - Gustavo Morilla

6

你需要使用 .GetValue<type>,所以尝试一下

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

您还可以查看详细的帖子https://dev59.com/fVwZ5IYBdhLWcg3wb_-Y#58432834 (显示如何获取值)。

https://qawithexperts.com/article/asp-net/read-values-from-appsettingsjson-in-net-core/467(显示从appsettings.json中绑定模型的方法)。

更新:

我创建了一个新的.NET Core 6 API 项目,并使用了这段代码。

  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();

这对我有效,这是GIF图像:

在此输入图像描述


没什么帮助。我更新了我的问题以更具体明确。 - user419022
@user419022 更新了我的回答,我尝试在VS 2022中创建了一个新的.NET Core 6项目并测试了输出,看起来没问题。 - Vikas Lalwani

0

这些选项可能会有所帮助:

  1. 也许你的 appsettings.json 文件在构建时没有被复制。右键点击 appsettings.json 文件,选择属性。然后 复制到输出目录 应该等于 如果较新则复制 或者 始终复制
  2. 如果你有多个类似 appsettings.jsonappsettings.Development.jsonappsettings.Production.json 的文件,请确保你的关键字(ProjectName)都在其中。

不好意思,它没有帮助。我更新了我的问题以使其更具体。 - user419022

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接