簡體   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