windows .NET 6中带前缀的环境变量

332nm8kg  于 2022-12-19  发布在  Windows
关注(0)|答案(1)|浏览(256)

实际上,这个问题是在我深入研究.NET 6中的配置设置时出现的。我已经设置了要在Production 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给环境变量更高的优先级(如果我错了请纠正我)。另外,请参考link
然后我看了看.AddEnvironmentVariables()还能做些什么,实际上它可以用来设置带前缀的环境变量,比如.AddEnvironmentVariables(prefix:"P2:"),我已经把我的带前缀的env变量设置为P2__Name,还有另一个env变量,设置为Name,我把这个值读为
var name = configuration["Name"];
当我运行API时,它总是读取"Name"环境变量的值。而不是"P2__Name"值。我做错了什么。它不应该返回带前缀的环境变量值吗?

**p.s.**我有多个.net应用程序要托管在一个Windows服务器上。所有这些应用程序在appsettings.json中都有dbConnection字符串。我想从appsettings.json中删除这些应用程序,并将它们保留为环境变量

hmae6n7t

hmae6n7t1#

对于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");

总结如下:

  • 自定义前缀:x1米11米1x
  • 特殊前缀:其中...可以是CUSTOMSQLMYSQLSQLAZURE

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

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

相关问题