如何从ASP.NET Core中的.json文件读取AppSettings值

440

我已经按照以下方式在appsettings/Config.json文件中设置了我的AppSettings数据:

{
  "AppSettings": {
        "token": "1234"
    }
}

我在网上搜索了如何从 .json 文件中读取 AppSettings 值的方法,但是没有找到有用的信息。

我尝试过:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

我知道在 ASP.NET 4.0 中你可以这样做:

System.Configuration.ConfigurationManager.AppSettings["token"];

但是在ASP.NET Core中我该如何实现这个呢?


可能是重复的问题:ASP.NET 5(vNext)-获取配置设置 - mason
提供额外见解的MSDN参考资料:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration - MDMoore313
这可以通过在.NET Core 2.0中使用IConfiguration的依赖注入来简化。具体解释请参见http://www.coding-issues.com/2018/10/read-values-from-appsettings-json-.net-core.html。 - Ranadheer Reddy
6
依赖注入适用于控制器。但是如果有人需要在中间件中读取一个值,该怎么办? - Alexander Ryan Baggett
如果你正在寻找一个 .net core 6 控制台应用程序,你可以看一下这个链接:https://dev59.com/QFEG5IYBdhLWcg3wfviM#70242856 - VivekDev
29个回答

14

这是ASP.NET Core完整使用案例!

articles.json

{
  "shownArticlesCount": 3,
  "articles": [
    {
      "title": "My Title 1",
      "thumbnailLink": "example.com/img1.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
    {
      "title": "My Title 2",
      "thumbnailLink": "example.com/img2.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
  ]
}

ArticleContainer.cs

public class ArticleContainer
{
    public int ShownArticlesCount { get; set; }

    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Title { get; set; }

    public string ThumbnailLink { get; set; }

    public string AuthorName { get; set; }

    public string AuthorProfileLink { get; set; }

    public DateTime PublishDate { get; set; }

    public string Text { get; set; }

    public string Link { get; set; } 
}

Startup.cs

public class Startup
{
    public IConfigurationRoot ArticleConfiguration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        ArticleConfiguration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("articles.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        services.Configure<ArticleContainer>(ArticleConfiguration);
    }
}

Index.cshtml.cs

public class IndexModel : PageModel
{
    public ArticleContainer ArticleContainer { get;set; }

    private readonly IOptions<ArticleContainer> _articleContainer;

    public IndexModel(IOptions<ArticleContainer> articleContainer)
    {
        _articleContainer = articleContainer;
    }

    public void OnGet()
    {
        ArticleContainer = _articleContainer.Value;
    }
}

Index.cshtml.cs

<h1>@Model.ArticleContainer.ShownArticlesCount</h1>

ASP.NET Core,哪个版本? - Steve Smith
1
@SteveSmith,基于启动构造函数,这是针对ASP.NET Core 2.2的。对于ASP.NET Core 3.1,只需将IHostingEnvironment更改为IWebHostEnvironment即可。 - Dush
@Dush 谢谢。总有一天他们会选择一个名字并对此感到满意的。 - Steve Smith

11

对于.NET Core 2.0,你可以简单地:

在 appsettings.json 文件中声明你的键/值对:

{
  "MyKey": "MyValue"
}

将配置服务注入到startup.cs中,并使用该服务获取值

using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IConfiguration configuration,
                          ... other injected services
                          )
    {
        app.Run(async (context) =>
        {
            string myValue = configuration["MyKey"];
            await context.Response.WriteAsync(myValue);
        });

11

虽然有点晚,但如果有人发现了这个问题。

您可以从Microsoft.Extensions.Configuration中调用IConfiguration;

public static IConfiguration Configuration { get; }
public static string MyAwesomeString = Configuration.GetSection("appSettings")["MyAwesomeString"].ToString();

9
只是为了补充Yuval Itzchakov的答案。
您可以不使用生成器函数来加载配置,只需注入即可。
public IConfiguration Configuration { get; set; }

public Startup(IConfiguration configuration)
{
   Configuration = configuration;
}

8

对于ASP.NET Core 6.0,您可以简单地:

更改 appsetting.json 文件。

{
  "AppSettings": {
        "Token": "1234"
    }
}

TestModel.cs

using Microsoft.Extensions.Configuration

public class TestModel : PageModel
{
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myToken = Configuration["AppSettings:Token"];        
        return Content($"myToken value: {myToken}");
    }
}

2
目前为止最简单的解决方案。按预期工作。 - tg24

8

.NET Core 2.1.0

  1. 在根目录下创建.json文件
  2. 在您的代码中:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. 安装以下依赖:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json

4.接着,重要提示: 右键点击appsettings.json文件->选择属性->选中仅在更新时复制: enter image description here

  1. 最后,你可以执行:

    config["key1"]

考虑到我的配置文件将是这样的:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}

8
private readonly ILogger<WeatherForecastController> _logger;

private IConfiguration _configuration;

public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
{
    _logger = logger;

    _configuration = configuration;
}

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
    //You can use any of these

    var db = _configuration.GetSection("ConnectionStrings").GetSection("BookStoresDB2").Value;

    var db1 = _configuration["ConnectionStrings:BookStoresDB2"];

    var db2 = _configuration.GetValue<string>("ConnectionStrings:BookStoresDB2");
}

8

您可以简单地使用...

var configurations = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();

var db3 = configurations["ConnectionStrings:BookStoresDB2"];

7
除了现有的答案外,我想提到有时候为了简单起见,拥有关于的扩展方法可能会很有用。
我将JWT配置保存在appsettings.json中,因此我的扩展方法类如下:
public static class ConfigurationExtensions
{
    public static string GetIssuerSigningKey(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:SecurityKey");
        return result;
    }

    public static string GetValidIssuer(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Issuer");
        return result;
    }

    public static string GetValidAudience(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Audience");
        return result;
    }

    public static string GetDefaultPolicy(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Policies:Default");
        return result;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey(this IConfiguration configuration)
    {
        var issuerSigningKey = configuration.GetIssuerSigningKey();
        var data = Encoding.UTF8.GetBytes(issuerSigningKey);
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string[] GetCorsOrigins(this IConfiguration configuration)
    {
        string[] result =
            configuration.GetValue<string>("App:CorsOrigins")
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray();

        return result;
    }
}

它可以节省很多代码行,让你只需写出简洁明了的代码:
...
x.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuerSigningKey = true,
    ValidateLifetime = true,
    IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
    ValidAudience = _configuration.GetValidAudience(),
    ValidIssuer = _configuration.GetValidIssuer()
};

还可以将IConfiguration实例注册为单例并在需要时注入-我在这里使用Autofac容器,以下是操作步骤:

var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();

您可以使用MS依赖注入实现相同的功能:
services.AddSingleton<IConfigurationRoot>(appConfiguration);

7

他们总是改变事情 - 刚刚更新了Visual Studio,整个项目崩溃了,在恢复过程中,新的方式看起来像这样:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

我总是错过这一行!

.SetBasePath(env.ContentRootPath)

1
我们如何使用相同的方法在测试项目中获取AppSettings值? - S.Siva
3
他们只是不断地修改东西。这个。在这个页面上几乎每个答案都仅适用于特定版本的 .Net Core。 - Steve Smith

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