繁体   English   中英

.NET 6 中的前缀环境变量

[英]Prefixed Environment Variables in .NET 6

实际上,这个问题是在我深入研究 .NET 6 中的配置设置时出现的。我已经设置了要在生产 Windows 服务器中使用的系统环境变量。 根据 MS 文档,如果我们想要读取系统环境变量,则需要使用.AddEnvironmentVariables()扩展方法。 因此,我修改了我的 Program.cs (Main()),如下所示。

 var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
 var config = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{env}.json",optional:true)
        .AddEnvironmentVariables()
        .Build();

我读了这样的环境变量

var conString = configuration["DBConnection:ConnectionString"];

这一切都很好。 一切都按预期工作。

我的问题是,即使我删除.AddEnvironmentVariables()扩展方法它也能工作。 这是因为,.NET 给予环境变量更高的优先级(如果我错了请纠正我)。 另外,请参考此链接

然后我在研究.AddEnvironmentVariables()还能做些什么。 实际上它可以用来设置前缀环境变量,比如.AddEnvironmentVariables(prefix:"P2:") ,我已经将我的前缀环境变量设置为P2__Name ,另一个环境变量设置为Name 我正在阅读该值

var name = configuration["Name"];

当我运行 api 时,它总是会读取"Name"环境变量的值。 不是"P2__Name"值。 我做错了什么。 它不应该返回带前缀的环境变量值吗?

ps我有多个 .net 应用程序要托管在单个 Windows 服务器中。 它们在appsettings.json中都有 dbConnection 字符串。 我想从appsettings.json中删除它们并将它们保留为环境变量

至于你的P2__NameName环境变量:

使用MyCustomPrefix_前缀设置的环境变量会覆盖默认配置提供程序。 这包括没有前缀的环境变量

前缀不会是配置键的一部分! 因此两者都将具有Name配置键,并且根据文档P2__Name环境变量的值应该覆盖Name配置键的值。

建议您的前缀以单个下划线字符 ( _ ) 结尾。

冒号字符 ( : ) 和双下划线字符串 ( __ ) 是层次分隔符(它们与您的前缀无关),请参阅配置键和值部分。

在环境变量中,冒号分隔符可能不适用于所有平台。 双下划线__受所有平台支持,并自动转换为冒号:

要有一个带前缀的连接字符串,请参阅文档是否其中一个特殊前缀适合您的需要。

您也可以使用自定义前缀。

// Option #1: custom prefix: MyCustomPrefix_ (Key: "A1")
// MyCustomPrefix_ConnectionStrings__A1=AbcConnectionString

// Option #2: special prefix: CUSTOMCONNSTR_ (Key: "A2")
// CUSTOMCONNSTR_A2=CustomConnectionString

// Option #3: special prefix: SQLCONNSTR_ (Key: "A3")
// SQLCONNSTR_A3=MssqlConnectionString

// Option #4: special prefix: MYSQLCONNSTR_ (Key: "A4")
// MYSQLCONNSTR_A4=MySqlConnectionString

// Option #5: special prefix: SQLAZURECONNSTR_ (Key: "A5")
// SQLAZURECONNSTR_A5=AzureSqlConnectionString

IConfiguration configuration =
    new ConfigurationBuilder()
        .AddEnvironmentVariables("MyCustomPrefix_")
        .Build();

string myCustomPrefixedConnectionString = configuration.GetConnectionString("A1");
string customConnectionString = configuration.GetConnectionString("A2");
string mssqlConnectionString = configuration.GetConnectionString("A3");
string mysqlConnectionString = configuration.GetConnectionString("A4");
string azuresqlConnectionString = configuration.GetConnectionString("A5");

总结:

  • 自定义前缀: YourCustomPrefix_ConnectionStrings__YourKey
  • 特殊前缀: ...CONNSTR_YourKey其中...可以是CUSTOMSQLMYSQLSQLAZURE

要获取连接字符串,只需要YourKey

string connectionString = configuration.GetConnectionString("YourKey");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM