ASP.NET Core 中的配置介绍

ASP.NET Core中可以从多种配置源中读取文件:

  • 配置文件,如appsetting.json
  • 环境变量
  • 命令行参数
  • 内存对象

0. 默认配置

生成ASP.NET Core Web应用程序时,会在Program的CreateHostBuilder()中使用Host.CreateDefaultBuilder方法为应用按以下顺序提供默认配置:

* appsetting.json
* appsetting.{Environment}.json,如appsetting.Development.json
* 环境变量
* 命令行参数

后面加载的配置会覆盖前面的,即如果一个配置在appsetting.json和命令行中都设置了,那么会以后加载的命令行配置为准。

1. 命令行参数

在程序启动时,可以使用命令行配置参数,有三种方式可以设置命令行参数:

  • 使用 “=”

    dotnet run MyKey="My key from command line" Position:Title=Cmd Position:Name=Cmd_Rick

  • 使用 “/”

    dotnet run /MyKey "Using /" /Position:Title=Cmd_ /Position:Name=Cmd_Rick

  • 使用 “--”

    dotnet run --MyKey "Using --" --Position:Title=Cmd-- --Position:Name=Cmd--Rick

键值:

必须后跟 =,或者当值后跟一个空格时,键必须具有一个 -- 或 / 的前缀。
如果使用 =,则不是必需的。 例如 MySetting=。

在同一命令中,请勿将使用 = 的命令行参数键值对与使用空格的键值对混合使用。

在代码中使用只需要将IConfigation接口注入到Controller中:

//命名空间 using Microsoft.Extensions.Configuration;

private readonly IConfiguration Configuration;

public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
{
    _logger = logger;
    this.Configuration = configuration;
}

[HttpGet]
public ContentResult Get()
{
    var myKeyValue = Configuration["MyKey"];
    var title = Configuration["Position:Title"];
    var name = Configuration["Position:Name"];
    var defaultLogLevel = Configuration["Logging:LogLevel:Default"];

    return Content($"MyKey value: {myKeyValue} \n" +
                    $"Title: {title} \n" +
                    $"Name: {name} \n" +
                    $"Default Log Level: {defaultLogLevel}");
}

2. 环境变量

需要注意的是所有平台均不支持使用“:”作为分隔符,因此可以使用双下划线"__"替代分号作为分隔符。

在windows下,有两个命令可以设置环境变量;

* set:  设置临时变量,该值只在当前cmd窗口范围下有效;
* setx: 永久设置环境变量,若加/M结尾则表名是设置系统变量,否则为用户变量

在之前的例子中,我们的appsettings.json文件如下:

{
    "MyKey": "mykey",
    "Position": {
        "Title": "shenzhen",
        "Name": "183"
    },
    "Logging": {
        "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning",
        "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

我们运行之后会得到上面文件中对应的输出:

MyKey value: mykey 
Title: shenzhen 
Name: 183 
Default Log Level: Information

接着,我们来试试环境变量的使用。

首先在项目跟目录下运行cmd:

set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run

然后在浏览器中访问http://localhost:5000/weatherforecast,这是就能看到输出是上述cmd命令中设置的值,而不是appsettings.json中的值。因为前面我们说了环境变量的加载顺序在json文件之后所以会将前面的值覆盖掉。

如果要将信息持久化到系统中需要使用setx命令,在命令结尾加上"/M"表示是系统变量。

setx MyKey "My key from setx Environment" /M
setx Position__Title Setx_Environment_Editor /M
setx Position__Name Environment_Rick /M

然而,系统变量往往较多,而我们程序实际上只需要使用我们指定的一小部分,因此可以指定只加载部分环境变量。这里就可以使用前缀加载模式。

我们可以使用AddEnvironmentVariables标识用来加载,首先我们要在Program.cs中指定加载环境变量:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(hostConfig =>
            {
                hostConfig.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

然后设置:

set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run

此时输出结果应该是上面的。

但是有一点是需要注意的,AddEnvironmentVariables是在默认配置提供程序之后加载的,因此默认配置程序加载DOTNET_和ASPNETCORE_前缀的环境变量和命令行参数在这里仍然是可用的。

3. 文件配置

默认情况下,Program.cs中的Host.CreateDefaultBuilder方法会加载默认的提供程序,如本文开头默认配置中所示。所以对于appsettings.json中的配置,我们可以直接使用,因为已经注册了。

如果我们需要加入自定义的json文件,那么只要如下操作:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(hostConfig =>
            {
                hostConfig.AddJsonFile("myConfig.json", optional: true, reloadOnChange: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

AddJsonFile方法中optional参数表示是否可选,如果为true则文件不存在也可运行,否则报错。reloadOnChange表示在变更时是否自动重新Load.

在项目根目录下新建myconfig.json文件,输入一下内容:

{
    "MyKey": "myconfig mykey",
    "Position": {
        "Title": "myconfig shenzhen",
        "Name": "myconfig aaa"
    }
}

运行程序可以看到:

MyKey value: myconfig mykey 
Title: myconfig shenzhen 
Name: myconfig aaa 
Default Log Level: Information

在这里myconfig.json中的配置覆盖了appsettings.json中的配置,这是因为CreateDefaultBuilder()中默认注册了appsettings.json,而AddJsonFile是在其后注册,所以会覆盖。

我们AddJsonFile的reloadOnChange属性设置为true, 启动应用之后,再修改myconfig.json中Name的值,然后再次访问站点,就能看到新的值了。

4. 内存配置

.NET Core也支持内存配置,实现起来也比较简单,只需要更改CreateHostBuilder方法:

public static IHostBuilder CreateHostBuilder(string[] args)
{
    var Dict = new Dictionary<string, string>
    {
        {"MyKey", "Dictionary MyKey Value"},
        {"Position:Title", "Dictionary_Title"},
        {"Position:Name", "Dictionary_Name" },
        {"Logging:LogLevel:Default", "Warning"}
    };

    return Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(hostConfig =>
        {
            hostConfig.AddInMemoryCollection(Dict);
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}

以上便完成了内存配置的注册。

5. 配置获取方法

.NET Core提供了GetValue(), GetSection(), GetChildren()和Exists()几个方法来获取配置的值。

对于上面的myconfig.json文件:

  • GetValue()

读取MyKey的值可以使用:

var myKeyValue = Configuration.GetValue<string>("MyKey", "aa");

如果未配置对应的值,则返回默认值aa;

  • GetSection()

获取Position节点:返回IConfigureSection然后再使用GetValue便可以访问Position下面的节点:

var postion = Configuration.GetSection("Position");
var title = postion.GetValue<string>("Title");

小结

本文先介绍了.NET Core的默认配置程序,然后分别介绍了命令行、环境变量、文件的配置方式,最后说明了读取配置文件的具体方法的使用。

标签: .net core, ASP.NET Core, 配置, appsettings

添加新评论