ASP.NET Core中的应用程序配置是使用一个或多个配置提供程序执行的。配置提供程序使用各种配置源从键值对读取配置数据:

  • 配置文件,例如appsettings.json
  • 环境变量
  • Azure Key Vault
  • Azure 应用配置
  • 命令行参数
  • 已安装或已创建的自定义提供程序
  • 目录文件
  • 内存中的.NET对象

应用程序和主机配置

  ASP.NET Core 应用配置和启动“主机”。 主机负责应用程序启动和生存期管理。 ASP.NET Core 模板创建的 WebApplicationBuilder 包含主机。 虽然可以在主机和应用程序配置提供程序中完成一些配置,但通常,只有主机必需的配置才应在主机配置中完成。

默认应用程序配置源

c#
1
var builder = WebApplication.CreateBuilder(args);

  WebApplication.CreateBuilder 使用预配置的默认值初始化 WebApplicationBuilder 类的新实例。 经过初始化的 WebApplicationBuilder (builder) 按照以下顺序为应用提供默认配置(从最高优先级到最低优先级):

  1. 使用命令行配置提供程序通过命令行参数提供
  2. 使用非前缀环境变量配置提供程序通过非前缀环境变量提供
  3. 应用在Development环境中运行时的用户机密
  4. 使用JSON配置提供程序通过appsettings.{Environment}.json提供
  5. 使用JSON配置提供程序通过appsettings.json提供
  6. 回退到下一部分所述的主机配置

默认主机配置源

  以下列表包含 WebApplicationBuilder 的从最高优先级到最低优先级的默认主机配置源:

  1. 使用命令行配置提供程序通过命令行参数提供
  2. 使用环境变量配置提供程序通过*DOTNET_*为前缀的环境变量提供
  3. 使用环境变量配置提供程序通过*ASPNETCORE_*为前缀的环境变量提供

  对于 .NET 通用主机和 Web 主机,从最高优先级到最低优先级的默认主机配置源为:

  1. 使用环境变量配置提供程序通过以 ASPNETCORE_ 为前缀的环境变量提供。
  2. 使用命令行配置提供程序通过命令行参数提供
  3. 使用环境变量配置提供程序通过以 DOTNET_ 为前缀的环境变量提供。

  在主机和应用程序配置中设置配置值时,将使用应用程序配置。

主机变量

  初始化主机生成器时,会提前锁定以下变量,并且它们不受应用程序配置的影响:

  • 应用程序名称
  • 环境名称,例如DevelopmentProductStaging
  • 内容根目录
  • Web根目录
  • 是否要扫描托管启动程序集以及要扫描哪些程序集
  • 应用和库代码从 IHostBuilder.ConfigureAppConfiguration 回调中的 HostBuilderContext.Configuration 读取的变量。

  从应用程序配置而不是主机配置读取所有其他主机设置。

应用程序配置提供程序

  以下代码按添加顺序显示了已启用的配置提供程序:

c#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Index2Model : PageModel
{
private IConfigurationRoot ConfigRoot;

public Index2Model(IConfiguration configRoot)
{
ConfigRoot = (IConfigurationRoot)configRoot;
}

public ContentResult OnGet()
{
string str = "";
// 通过Providers属性获取所有应用程序配置提供服务
foreach (var provider in ConfigRoot.Providers.ToList())
{
str += provider.ToString() + "\n";
}

return Content(str);
}
}

  前面的优先级从高到低的默认配置源列表以它们被添加到模板生成的应用程序中的相反顺序显示提供程序。 例如,JSON 配置提供程序被添加到命令行配置提供程序之前。

  后来添加的配置提供程序具有更高的优先级并且会替代之前的密钥设置。 例如,如果 appsettings.json 和环境中都设置了 MyKey,则使用环境值。 通过默认配置提供程序,命令行配置提供程序将替代其他所有提供程序。

appsettings.json

json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
c#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;

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

public ContentResult OnGet()
{
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}");
}
}

  默认的 JsonConfigurationProvider 会按以下顺序加载配置:

  1. appsettings.json
  2. appsettings.{Environment}.json :例如,appsettings.Production.jsonappsettings.Development.json 文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName 加载的。

  使用默认配置时,会通过 reloadOnChange: true 启用 appsettings.jsonappsettings.{Environment}.json 文件。 应用启动后,对 appsettings.jsonappsettings.{Environment}.json 文件所做的更改将由 JSON 配置提供程序读取。

安全性和用户机密

  配置数据指南:

  • 请勿在配置提供程序代码或纯文本配置文件中存储密码或其他敏感数据。 机密管理器工具可用于存储开发环境中的机密。
  • 不要在开发或测试环境中使用生产机密。
  • 请在项目外部指定机密,避免将其意外提交到源代码存储库。

  默认情况下,将在 JSON 配置源后注册用户机密配置源。 因此,用户机密密钥优先于 appsettings.jsonappsettings.{Environment}.json 中的密钥。

显示环境变量

  下面的代码显示了应用程序启动时的环境变量和值,这对调试环境设置很有帮助:

c#
1
2
3
4
5
6
7
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

foreach (var c in builder.Configuration.AsEnumerable())
{
Console.WriteLine(c.Key + " = " + c.Value);
}