.Net Core 5 控制台应用程序,在 Program.Main 中完成时不会加载环境的应用程序设置

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”文件:

  • 应用程序设置.json
  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json

每个文件属性都设置为“构建操作:内容”和“复制到输出目录:如果较新则复制”。

在我的 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包,但没有效果:

  1. Microsoft.扩展.配置
  2. Microsoft.Extensions.Configuration.Binder
  3. Microsoft.Extensions.Configuration.EnvironmentVariables
  4. Microsoft.Extensions.Configuration.Json

我缺少什么?

Pan*_*vos 7

控制台应用程序检查DOTNET_环境变量,而不是ASPNETCORE_变量。这不是一个新的变化。它至少可以追溯到 .NET Core 3.1。您需要进行设置DOTNET_ENVIRONMENT

ASPNETCORE_除了变量之外,ASP.NET Core 应用程序还使用任何以 为前缀的环境变量DOTNET_

来自文档

默认配置加载以 DOTNET_ 和 ASPNETCORE_ 为前缀的环境变量和命令行参数。ASP.NET Core 使用 DOTNET_ 和 ASPNETCORE_ 前缀进行主机和应用配置,但不用于用户配置。有关主机和应用程序配置的更多信息,请参阅.NET 通用主机。

PS:就在10分钟前,我遇到了同样的问题,并意识到我已经设置了DOTNETCORE_ENVIRONMENT而不是DOTNET_ENVIRONMENT

  • 这是行不通的。我尝试过使用 ASPNETCORE_ENVIRONMENT 和 DOTNET_ENVIRONMENT。两者都不起作用。我还缺少其他东西。 (2认同)

Tom*_*gan 1

谢谢大家,特别是@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 之前,这些都不是必需的。