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的默认配置程序,然后分别介绍了命令行、环境变量、文件的配置方式,最后说明了读取配置文件的具体方法的使用。