Tom*_*gan 7 console-application appsettings .net-core .net-5
我希望我的 .Net Core 5 控制台应用程序根据 DOTNET_ENVIRONMENT 环境变量从相应的 appsettings 文件中选择设置。我通过在 Visual Studio 2019 调试器中运行它并从 launchSettings.json 文件中获取环境来对此进行测试。
在 .Net Core 5 控制台应用程序中,我有 4 个“appsettings”文件:
每个文件属性都设置为“构建操作:内容”和“复制到输出目录:如果较新则复制”。
在我的 launchSettings.json 中,我将环境设置为“Staging”,如下所示:
{
"profiles": {
"MyAppName": {
"commandName": "Project",
"dotnetRunMessages": "true",
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Staging"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我需要访问 Program.cs 中“Main”方法中的配置,因此在该类中我设置了一个模块级字符串变量“_environment”,如下所示在静态构造函数中:
_environment = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
Run Code Online (Sandbox Code Playgroud)
这有效;值“Staging”被加载到变量 _environment 中。
然后,我将配置加载到静态变量中,如下所示:(编辑 - 这是我的错误,假设此静态属性在静态构造函数之后加载。事实上,它在静态构造函数之前加载。这意味着未设置 _environment 变量,这意味着我的环境特定的应用程序设置文件从未加载)。
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();
Run Code Online (Sandbox Code Playgroud)
然后,当我检查配置的内容时,我发现它仅从 appsettings.json 加载值。它不会从 appsettings.Staging.json 加载值。我正在寻找的具体值是“ConnectionStrings”。这是 ConnectionStrings 部分在 appsettings.json 中的样子:
"ConnectionStrings": {
"ConnectionStringName": "Data Source=SqlDevelopment; Initial Catalog=MyTable; Integrated Security=SSPI;",
}
Run Code Online (Sandbox Code Playgroud)
这就是同一部分在 appsettings.Staging.json 中的样子:
"ConnectionStrings": {
"ConnectionStringName": "Data Source=SqlStaging; Initial Catalog=MyTable; Integrated Security=SSPI;",
}
Run Code Online (Sandbox Code Playgroud)
但是,当我从配置中读取数据源时,它始终是“SqlDevelopment”,即使环境是暂存的。
经过尝试失败后,我尝试加载这4个Nuget包,但没有效果:
我缺少什么?
控制台应用程序检查DOTNET_环境变量,而不是ASPNETCORE_变量。这不是一个新的变化。它至少可以追溯到 .NET Core 3.1。您需要进行设置DOTNET_ENVIRONMENT。
ASPNETCORE_除了变量之外,ASP.NET Core 应用程序还使用任何以 为前缀的环境变量DOTNET_。
来自文档:
默认配置加载以 DOTNET_ 和 ASPNETCORE_ 为前缀的环境变量和命令行参数。ASP.NET Core 使用 DOTNET_ 和 ASPNETCORE_ 前缀进行主机和应用配置,但不用于用户配置。有关主机和应用程序配置的更多信息,请参阅.NET 通用主机。
PS:就在10分钟前,我遇到了同样的问题,并意识到我已经设置了而不是DOTNETCORE_ENVIRONMENTDOTNET_ENVIRONMENT
谢谢大家,特别是@CodeCaster 对我的帮助。
问题是设置静态配置时 _environment 变量是空字符串。我假设因为我在静态构造函数中设置它,所以它是可用的,但静态构造函数实际上在我设置静态配置后运行,因此 _environment 是一个空字符串,因此从未加载“Staging”配置。
我更改了代码,以便运行时不会按照我不期望的顺序设置变量:
private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")}.json", optional: true, reloadOnChange: true)
.Build();
Run Code Online (Sandbox Code Playgroud)
许多海报基本上告诉我“你做错了”。我意识到运行时在调用 Host.CreateDefaultBuilder() 后提供了一个依赖项注入的配置。由于超出这个问题范围的原因,我碰巧需要在该调用发生之前在 Program.Main 内进行配置。如果我不需要在 Program.Main 中进行配置,那么在调用 Host.CreateDefaultBuilder 之前,这些都不是必需的。
| 归档时间: |
|
| 查看次数: |
7395 次 |
| 最近记录: |