如何从ASP.NET内核中的Config.json读取AppSettings值?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我已经在Config.json中设置了我的AppSettings设置:

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

我在网上搜索了如何从config.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 Core 1.0保持同步(截至2016年9月15日)。

这主要来自官方文件

首先,我们将所需的依赖关系添加到我们的project.json文件中,这些文件位于Microsoft.Extensions.Configuration.*命名空间下:

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0"
    },
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Configuration": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json":"1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
  },
  ...
}

要使用ASP.NET应用程序中的设置,建议只Configuration在应用程序的Startup类中实例化一个。然后,使用选项模式访问各个设置。假设我们有一个如下所示的appsettings.json文件:

{
  "ApplicationName": "MyApp",
  "Version": "1.0.0"
}

我们有一个代表配置的POCO对象:

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

现在我们在下面构建配置Startup.cs

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

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

        Configuration = builder.Build();
    }
}

如果我们想将我们的配置注入到控制器中,我们需要在运行时注册它。我们通过Startup.ConfigureServices以下方式来完

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

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration);
}

我们像这样注入它:

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

Startup类:

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

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

        Configuration = builder.Build();
    }

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

        // Add functionality to inject IOptions<T>
        services.AddOptions();

        // Add our Config object so it can be injected
        services.Configure<MyConfig>(Configuration);
    }
}
用户回答回答于

首先:Microsoft.Framework.ConfigurationModel的程序集名称和名称空间已更改为Microsoft.Framework.Configuration。所以你应该使用:例如

"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"

作为依赖project.json。如果没有安装7,请使用beta5或6。然后你可以做这样的事情Startup.cs

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
     var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
     Configuration = configurationBuilder.Build();
}

如果你想从config.json中检索一个变量,你可以马上使用它:

public void Configure(IApplicationBuilder app)
    {
        // Add .Value to get the token string
        var token = Configuration.GetSection("AppSettings:token");
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("This is a token with key (" + token.Key + ") " + token.Value);
        });
    }

或者你可以像这样创建一个名为AppSettings的类:

public class AppSettings
{
    public string token { get; set; }
}

并配置这样的服务:

public void ConfigureServices(IServiceCollection services)
    {

        services.AddMvc();
        services.Configure<MvcOptions>(options =>
        {
            //mvc options
        });

        services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
    }

然后通过像这样的控制器访问它:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}

扫码关注云+社区