在 .Net Core 5 控制台应用程序中,我有 4 个 "appsettings" 文件:
- appsettings.json - appsettings.Development.json - appsettings.Staging.json - appsettings.Production.json
每个文件的属性都设置为 Build Action:Content,并且 Copy to Output Directory:Copy if newer。
在 launchSettings.json 中,我将环境设置为 "Staging",如下所示:
{
"profiles": {
"MyAppName": {
"commandName": "Project",
"dotnetRunMessages": "true",
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Staging"
}
}
}
}
我需要在Program.cs的"Main"方法中访问我的配置信息,所以在那个类中,我通过静态构造方法设置了一个模块级别的字符串变量"_environment",代码如下:
_environment = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
这个代码是有效的,变量_environment加载了值"Staging"。
然后我像这样将我的配置加载到静态变量中:(编辑-这是我的错误,我假设这个静态属性在静态构造函数之后加载。实际上,它在静态构造函数之前加载。这意味着_environment变量没有设置,这意味着我的环境特定的appsettings文件永远不会加载)。
private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{_environment}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
当我检查Configuration的内容时,我发现它只从appsettings.json中加载值。它没有从appsettings.Staging.json加载值。 我要查找的特定值是“ConnectionStrings”。这是appsettings.json中ConnectionStrings部分的样子:
"ConnectionStrings": {
"ConnectionStringName": "Data Source=SqlDevelopment; Initial Catalog=MyTable; Integrated Security=SSPI;",
}
下面是相同部分在appsettings.Staging.json文件中的样子:
"ConnectionStrings": {
"ConnectionStringName": "Data Source=SqlStaging; Initial Catalog=MyTable; Integrated Security=SSPI;",
}
但是当我从配置中读取DataSource时,它总是 "SqlDevelopment",即使环境是Staging。
尝试并失败后,我尝试加载这4个NuGet包,但没有效果:
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.EnvironmentVariables
- Microsoft.Extensions.Configuration.Json
我错过了什么?
launchsettings.json
文件中的行。该文件仅在IDE启动进程时用于设置环境变量。当您在IDE之外运行应用程序时,该文件不会被使用。 - Panagiotis KanavosHost.CreateDefaultBuilder(args)
时,默认行为是读取设置文件(包括环境文件)、环境变量和命令行参数。 - Panagiotis Kanavos