ASP.NET Core 中的應用配置基于配置提供程序建立的鍵值對。 配置提供程序?qū)⑴渲脭?shù)據(jù)從各種配置源讀取到鍵值對:
選項模式是本主題中描述的配置概念的擴展。 選項使用類來表示相關設置的組。 有關使用選項模式的詳細信息,請參閱 ASP.NET Core 中的選項模式。
這三個包均包括在 Microsoft.AspNetCore.App 元包中。
在配置并啟動應用之前,配置并啟動主機。 主機負責應用程序啟動和生存期管理。 應用和主機均使用本主題中所述的配置提供程序進行配置。 主機配置鍵值對成為應用的全局配置的一部分。 有關在構建主機時如何使用配置提供程序以及配置源如何影響主機配置的詳細信息,請參閱主機。
基于 ASP.NET Core dotnet 新模板的 Web 應用在生成主機時會調(diào)用 CreateDefaultBuilder。CreateDefaultBuilder 按照以下順序為應用提供默認配置:
本主題后面將介紹配置提供程序。 有關主機和 CreateDefaultBuilder 的更多信息,請參閱 ASP.NET Core Web 主機。
采用以下最佳實踐:
詳細了解如何使用多個環(huán)境和管理使用 Secret Manager 的開發(fā)中的應用機密的安全存儲(包括使用環(huán)境變量存儲敏感數(shù)據(jù)的建議)。 Secret Manager 使用文件配置提供程序?qū)⒂脩魴C密存儲在本地系統(tǒng)上的 JSON 文件中。 本主題后面將介紹文件配置提供程序。
Azure Key Vault 是安全存儲應用機密的一種選擇。 有關更多信息,請參見在 ASP.NET Core 中的 azure 密鑰保管庫配置提供程序。
配置 API 能夠通過在配置鍵中使用分隔符來展平分層數(shù)據(jù)以保持分層配置數(shù)據(jù)。
在以下 JSON 文件中,兩個節(jié)的結構化層次結構中存在四個鍵:
JSON
{
"section0": {
"key0": "value",
"key1": "value"
},
"section1": {
"key0": "value",
"key1": "value"
}
}
將文件讀入配置時,將創(chuàng)建唯一鍵以保持配置源的原始分層數(shù)據(jù)結構。 使用冒號 (:) 展平節(jié)和鍵以保持原始結構:
GetSection 和 GetChildren 方法可用于隔離各個節(jié)和配置數(shù)據(jù)中某節(jié)的子節(jié)。 稍后將在 GetSection、GetChildren 和 Exists 中介紹這些方法。 GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。
在應用啟動時,將按照指定的配置提供程序的順序讀取配置源。
應用啟動后,在更改基礎設置文件時,文件配置提供程序可以重載配置。 本主題后面將介紹文件配置提供程序。
應用的依賴關系注入 (DI) 容器中提供了 IConfiguration。 IConfiguration 可注入到 Razor Pages PageModel 以獲取以下類的配置:
C#
// using Microsoft.Extensions.Configuration;
public class IndexModel : PageModel
{
private readonly IConfiguration _config;
public IndexModel(IConfiguration config)
{
_config = config;
}
// The _config local variable is used to obtain configuration
// throughout the class.
}
配置提供程序不能使用 DI,因為主機在設置這些提供程序時 DI 不可用。
配置鍵采用以下約定:
配置值采用以下約定:
下表顯示了 ASP.NET Core 應用可用的配置提供程序。
提供程序 | 通過以下對象提供配置… |
---|---|
Azure Key Vault 配置提供程序(安全主題) | Azure Key Vault |
命令行配置提供程序 | 命令行參數(shù) |
自定義配置提供程序 | 自定義源 |
環(huán)境變量配置提供程序 | 環(huán)境變量 |
文件配置提供程序 | 文件(INI、JSON、XML) |
Key-per-file 配置提供程序 | 目錄文件 |
內(nèi)存配置提供程序 | 內(nèi)存中集合 |
用戶機密 (Secret Manager)(安全主題) | 用戶配置文件目錄中的文件 |
按照啟動時指定的配置提供程序的順序讀取配置源。 本主題中所述的配置提供程序按字母順序進行介紹,而不是按代碼排列順序進行介紹。 代碼中的配置提供程序應以特定順序排列以符合基礎配置源的優(yōu)先級。
配置提供程序的典型順序為:
通常的做法是將命令行配置提供程序置于一系列提供程序的末尾,以允許命令行參數(shù)替代由其他提供程序設置的配置。
在使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時,將使用此提供程序序列。 有關詳細信息,請參閱 Web 主機:設置主機。
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置提供程序以及 CreateDefaultBuilder自動添加的配置提供程序:
C#
public class Program
{
public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
{
{"array:entries:0", "value0"},
{"array:entries:1", "value1"},
{"array:entries:2", "value2"},
{"array:entries:4", "value4"},
{"array:entries:5", "value5"}
};
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddInMemoryCollection(arrayDict);
config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
config.AddCommandLine(args);
})
.UseStartup<Startup>();
}
在應用啟動期間,可以使用 ConfigureAppConfiguration 中提供給應用的配置,包括 Startup.ConfigureServices。 有關詳細信息,請參閱在啟動期間訪問配置部分。
CommandLineConfigurationProvider 在運行時從命令行參數(shù)鍵值對加載配置。
要激活命令行配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddCommandLine 擴展方法。
使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時會自動調(diào)用 AddCommandLine。 有關詳細信息,請參閱 Web 主機:設置主機。
此外,CreateDefaultBuilder 也會加載:
CreateDefaultBuilder 最后添加命令行配置提供程序。 在運行時傳遞的命令行參數(shù)會替代由其他提供程序設置的配置。
CreateDefaultBuilder 在構造主機時起作用。 因此,CreateDefaultBuilder 激活的命令行配置可能會影響主機的配置方式。
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置。
CreateDefaultBuilder 已經(jīng)調(diào)用了 AddCommandLine。 如果需要提供應用配置并仍然能夠使用命令行參數(shù)覆蓋該配置,請在 ConfigureAppConfiguration 中調(diào)用應用的其他提供程序并最后調(diào)用 AddCommandLine。
C#
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
// Call other providers here and call AddCommandLine last.
config.AddCommandLine(args);
})
.UseStartup<Startup>();
}
直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration:
C#
var config = new ConfigurationBuilder()
// Call additional providers here as needed.
// Call AddCommandLine last to allow arguments to override other configuration.
.AddCommandLine(args)
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
示例
示例應用利用靜態(tài)便捷方法 CreateDefaultBuilder 來生成主機,其中包括一個對 AddCommandLine的調(diào)用。
該值必須后跟一個等號 (=),否則當值后跟一個空格時,鍵必須具有前綴(-- 或 /)。 如果使用等號(例如,CommandLineKey=),則該值可以為 null。
鍵前綴 | 示例 |
---|---|
無前綴 | CommandLineKey1=value1 |
雙劃線 (-- ) | --CommandLineKey2=value2 , --CommandLineKey2 value2 |
正斜杠 (/ ) | /CommandLineKey3=value3 , /CommandLineKey3 value3 |
在同一命令中,不要將使用等號的命令行參數(shù)鍵值對與使用空格的鍵值對混合使用。
示例命令:
console
dotnet run CommandLineKey1=value1 --CommandLineKey2=value2 /CommandLineKey3=value3
dotnet run --CommandLineKey1 value1 /CommandLineKey2 value2
dotnet run CommandLineKey1= CommandLineKey2=value2
交換映射支持鍵名替換邏輯。 使用 ConfigurationBuilder 手動構建配置時,可以為 AddCommandLine 方法提供交換替換字典。
當使用交換映射字典時,會檢查字典中是否有與命令行參數(shù)提供的鍵匹配的鍵。 如果在字典中找到命令行鍵,則傳回字典值(鍵替換)以將鍵值對設置為應用的配置。 對任何具有單劃線 (-) 前綴的命令行鍵而言,交換映射都是必需的。
交換映射字典鍵規(guī)則:
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:
C#
public class Program
{
public static readonly Dictionary<string, string> _switchMappings =
new Dictionary<string, string>
{
{ "-CLKey1", "CommandLineKey1" },
{ "-CLKey2", "CommandLineKey2" }
};
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
// Do not pass the args to CreateDefaultBuilder
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder()
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddCommandLine(args, _switchMappings);
})
.UseStartup<Startup>();
}
如前面的示例所示,當使用交換映射時,對 CreateDefaultBuilder 的調(diào)用不應傳遞參數(shù)。 CreateDefaultBuilder 方法的 AddCommandLine 調(diào)用不包括映射的交換,并且無法將交換映射字典傳遞給 CreateDefaultBuilder。 如果參數(shù)包含映射的交換并傳遞給 CreateDefaultBuilder,則其 AddCommandLine 提供程序無法使用 FormatException 進行初始化。 解決方案不是將參數(shù)傳遞給 CreateDefaultBuilder,而是允許 ConfigurationBuilder 方法的 AddCommandLine 方法處理參數(shù)和交換映射字典。
創(chuàng)建交換映射字典后,它將包含下表所示的數(shù)據(jù)。
鍵 | 值 |
---|---|
-CLKey1 | CommandLineKey1 |
-CLKey2 | CommandLineKey2 |
如果在啟動應用時使用了交換映射的鍵,則配置將接收字典提供的密鑰上的配置值:
console
dotnet run -CLKey1=value1 -CLKey2=value2
運行上述命令后,配置包含下表中顯示的值。
鍵 | 值 |
---|---|
CommandLineKey1 | value1 |
CommandLineKey2 | value2 |
EnvironmentVariablesConfigurationProvider 在運行時從環(huán)境變量鍵值對加載配置。
要激活環(huán)境變量配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddEnvironmentVariables 擴展方法。
在環(huán)境變量中使用分層鍵時,冒號分隔符 (:) 可能無法適用于所有平臺(例如 Bash)。 所有平臺均支持采用雙下劃線 (__),并可以用冒號替換。
借助 Azure 應用服務,用戶可以在 Azure 門戶中設置使用環(huán)境變量配置提供程序替代應用配置的環(huán)境變量。 有關詳細信息,請參閱 Azure 應用:使用 Azure 門戶替代應用配置。
初始化一個新的 WebHostBuilder 時,對于前綴為 ASPNETCORE_ 的環(huán)境變量,會自動調(diào)用 AddEnvironmentVariables。 有關詳細信息,請參閱 Web 主機:設置主機。
此外,CreateDefaultBuilder 也會加載:
環(huán)境變量配置提供程序是在配置已根據(jù)用戶機密和 appsettings 文件建立后調(diào)用。 在此位置調(diào)用提供程序允許在運行時讀取的環(huán)境變量替代由用戶機密和 appsettings 文件設置的配置。
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置。
如果需要從其他環(huán)境變量提供應用配置,請在 ConfigureAppConfiguration 中調(diào)用應用的其他提供程序,并使用前綴調(diào)用 AddEnvironmentVariables。
C#
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
// Call additional providers here as needed.
// Call AddEnvironmentVariables last if you need to allow environment
// variables to override values from other providers.
config.AddEnvironmentVariables(prefix: "PREFIX_");
})
.UseStartup<Startup>();
}
直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration:
C#
var config = new ConfigurationBuilder()
.AddEnvironmentVariables()
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
示例
示例應用利用靜態(tài)便捷方法 CreateDefaultBuilder 來生成主機,其中包括一個對 AddEnvironmentVariables 的調(diào)用。
為了使應用呈現(xiàn)的環(huán)境變量列表簡短,應用將環(huán)境變量篩選為以下列內(nèi)容開頭的變量:
如果希望公開應用可用的所有環(huán)境變量,請將 Pages/Index.cshtml.cs 中的 FilteredConfiguration 更改為以下內(nèi)容:
C#
FilteredConfiguration = _config.AsEnumerable();
為 AddEnvironmentVariables 方法提供前綴時,將篩選加載到應用的配置中的環(huán)境變量。 例如,要篩選前綴 CUSTOM_ 上的環(huán)境變量,請將前綴提供給配置提供程序:
C#
var config = new ConfigurationBuilder()
.AddEnvironmentVariables("CUSTOM_")
.Build();
創(chuàng)建配置鍵值對時,將去除前綴。
靜態(tài)便捷方法 CreateDefaultBuilder 創(chuàng)建一個 WebHostBuilder 以建立應用的主機。 創(chuàng)建 WebHostBuilder 時,它會在前綴為 ASPNETCORE_ 的環(huán)境變量中找到其主機配置。
連接字符串前綴
針對為應用環(huán)境配置 Azure 連接字符串所涉及的四個連接字符串環(huán)境變量,配置 API 具有特殊的處理規(guī)則。 如果沒有向 AddEnvironmentVariables 提供前綴,則具有表中所示前綴的環(huán)境變量將加載到應用中。
連接字符串前綴 | 提供程序 |
---|---|
CUSTOMCONNSTR_ | 自定義提供程序 |
MYSQLCONNSTR_ | MySQL |
SQLAZURECONNSTR_ | Azure SQL 數(shù)據(jù)庫 |
SQLCONNSTR_ | SQL Server |
當發(fā)現(xiàn)環(huán)境變量并使用表中所示的四個前綴中的任何一個加載到配置中時:
環(huán)境變量鍵 | 轉(zhuǎn)換的配置鍵 | 提供程序配置條目 |
---|---|---|
CUSTOMCONNSTR_<KEY> | ConnectionStrings:<KEY> | 配置條目未創(chuàng)建。 |
MYSQLCONNSTR_<KEY> | ConnectionStrings:<KEY> | 鍵:ConnectionStrings:<KEY>_ProviderName :值: MySql.Data.MySqlClient |
SQLAZURECONNSTR_<KEY> | ConnectionStrings:<KEY> | 鍵:ConnectionStrings:<KEY>_ProviderName :值: System.Data.SqlClient |
SQLCONNSTR_<KEY> | ConnectionStrings:<KEY> | 鍵:ConnectionStrings:<KEY>_ProviderName :值: System.Data.SqlClient |
FileConfigurationProvider 是從文件系統(tǒng)加載配置的基類。 以下配置提供程序?qū)S糜谔囟ㄎ募愋停?/p>
IniConfigurationProvider 在運行時從 INI 文件鍵值對加載配置。
若要激活 INI 文件配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddIniFile 擴展方法。
冒號可用作 INI 文件配置中的節(jié)分隔符。
重載允許指定:
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:
C#
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddIniFile("config.ini", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();
}
基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。
直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration:
C#
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddIniFile("config.ini", optional: true, reloadOnChange: true)
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。
INI 配置文件的通用示例:
ini
[section0]
key0=value
key1=value
[section1]
subsection:key=value
[section2:subsection0]
key=value
[section2:subsection1]
key=value
以前的配置文件使用 value 加載以下鍵:
JsonConfigurationProvider 在運行時期間從 JSON 文件鍵值對加載配置。
若要激活 JSON 文件配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddJsonFile 擴展方法。
重載允許指定:
使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 時,會自動調(diào)用 AddJsonFile 兩次。 調(diào)用該方法來從以下文件加載配置:
有關詳細信息,請參閱 Web 主機:設置主機。
此外,CreateDefaultBuilder 也會加載:
首先建立 JSON 配置提供程序。 因此,用戶機密、環(huán)境變量和命令行參數(shù)會替代由 appsettings 文件設置的配置。
構建主機時調(diào)用 ConfigureAppConfiguration 以指定除 appsettings.json 和 appsettings.{Environment}.json 以外的文件的應用配置:
C#
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("config.json", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();
}
基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。
直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration:
C#
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: true, reloadOnChange: true)
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。
示例
示例應用利用靜態(tài)便捷方法 CreateDefaultBuilder 來生成主機,其中包括兩個對 AddJsonFile 的調(diào)用。 配置從 appsettings.json 和 appsettings.{Environment}.json 進行加載。
鍵 | 開發(fā)值 | 生產(chǎn)值 |
---|---|---|
Logging:LogLevel:System | 信息 | 信息 |
Logging:LogLevel:Microsoft | 信息 | 信息 |
Logging:LogLevel:Default | 調(diào)試 | Error |
AllowedHosts | * | * |
XmlConfigurationProvider 在運行時從 XML 文件鍵值對加載配置。
若要激活 XML 文件配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddXmlFile 擴展方法。
重載允許指定:
創(chuàng)建配置鍵值對時,將忽略配置文件的根節(jié)點。 不要在文件中指定文檔類型定義 (DTD) 或命名空間。
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:
C#
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddXmlFile("config.xml", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();
}
基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。
直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration:
C#
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddXmlFile("config.xml", optional: true, reloadOnChange: true)
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。
XML 配置文件可以為重復節(jié)使用不同的元素名稱:
XML
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section0>
<key0>value</key0>
<key1>value</key1>
</section0>
<section1>
<key0>value</key0>
<key1>value</key1>
</section1>
</configuration>
以前的配置文件使用 value 加載以下鍵:
如果使用 name 屬性來區(qū)分元素,則使用相同元素名稱的重復元素可以正常工作:
XML
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section name="section0">
<key name="key0">value</key>
<key name="key1">value</key>
</section>
<section name="section1">
<key name="key0">value</key>
<key name="key1">value</key>
</section>
</configuration>
以前的配置文件使用 value 加載以下鍵:
屬性可用于提供值:
XML
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<key attribute="value" />
<section>
<key attribute="value" />
</section>
</configuration>
以前的配置文件使用 value 加載以下鍵:
KeyPerFileConfigurationProvider 使用目錄的文件作為配置鍵值對。 該鍵是文件名。 該值包含文件的內(nèi)容。 Key-per-file 配置提供程序用于 Docker 托管方案。
若要激活 Key-per-file 配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddKeyPerFile 擴展方法。 文件的 directoryPath 必須是絕對路徑。
重載允許指定:
雙下劃線字符 (__) 用作文件名中的配置鍵分隔符。 例如,文件名 Logging__LogLevel__System 生成配置鍵 Logging:LogLevel:System。
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:
C#
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files");
config.AddKeyPerFile(directoryPath: path, optional: true);
})
.UseStartup<Startup>();
}
基路徑使用 SetBasePath 設置。 SetBasePath 在 Microsoft.Extensions.Configuration.FileExtensions包中,后者在 Microsoft.AspNetCore.App 元包中。
直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration:
C#
var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files");
var config = new ConfigurationBuilder()
.AddKeyPerFile(directoryPath: path, optional: true)
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
MemoryConfigurationProvider 使用內(nèi)存中集合作為配置鍵值對。
若要激活內(nèi)存中集合配置,請在 ConfigurationBuilder 的實例上調(diào)用 AddInMemoryCollection 擴展方法。
可以使用 IEnumerable<KeyValuePair<String,String>> 初始化配置提供程序。
構建主機時調(diào)用 ConfigureAppConfiguration 以指定應用的配置:
C#
public class Program
{
public static readonly Dictionary<string, string> _dict =
new Dictionary<string, string>
{
{"MemoryCollectionKey1", "value1"},
{"MemoryCollectionKey2", "value2"}
};
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddInMemoryCollection(_dict);
})
.UseStartup<Startup>();
}
直接創(chuàng)建 WebHostBuilder 時,請使用以下配置調(diào)用 UseConfiguration:
C#
var dict = new Dictionary<string, string>
{
{"MemoryCollectionKey1", "value1"},
{"MemoryCollectionKey2", "value2"}
};
var config = new ConfigurationBuilder()
.AddInMemoryCollection(dict)
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseStartup<Startup>();
ConfigurationBinder.GetValue<T> 從具有指定鍵的配置中提取一個值,并將其轉(zhuǎn)換為指定類型。 如果未找到該鍵,則過載允許你提供默認值。
如下示例中:
C#
// using Microsoft.Extensions.Configuration;
public class IndexModel : PageModel
{
public IndexModel(IConfiguration config)
{
_config = config;
}
public int NumberConfig { get; private set; }
public void OnGet()
{
NumberConfig = _config.GetValue<int>("NumberKey", 99);
}
}
對于下面的示例,請考慮以下 JSON 文件。 在兩個節(jié)中找到四個鍵,其中一個包含一對子節(jié):
JSON
{
"section0": {
"key0": "value",
"key1": "value"
},
"section1": {
"key0": "value",
"key1": "value"
},
"section2": {
"subsection0" : {
"key0": "value",
"key1": "value"
},
"subsection1" : {
"key0": "value",
"key1": "value"
}
}
}
將文件讀入配置時,會創(chuàng)建以下唯一的分層鍵來保存配置值:
IConfiguration.GetSection 使用指定的子節(jié)鍵提取配置子節(jié)。 GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。
若要返回僅包含 section1 中鍵值對的 IConfigurationSection,請調(diào)用 GetSection 并提供節(jié)名稱:
C#
var configSection = _config.GetSection("section1");
configSection 不具有值,只有密鑰和路徑。
同樣,若要獲取 section2:subsection0 中鍵的值,請調(diào)用 GetSection 并提供節(jié)路徑:
C#
var configSection = _config.GetSection("section2:subsection0");
GetSection 永遠不會返回 null。 如果找不到匹配的節(jié),則返回空 IConfigurationSection。
當 GetSection 返回匹配的部分時,Value 未填充。 存在該部分時,返回一個 Key 和 Path 部分。
在 section2 上調(diào)用 IConfiguration.GetChildren 會獲得 IEnumerable<IConfigurationSection>,其中包括:
C#
var configSection = _config.GetSection("section2");
var children = configSection.GetChildren();
使用 ConfigurationExtensions.Exists 確定配置節(jié)是否存在:
C#
var sectionExists = _config.GetSection("section2:subsection2").Exists();
給定示例數(shù)據(jù),sectionExists 為 false,因為配置數(shù)據(jù)中沒有 section2:subsection2 節(jié)。
可以使用選項模式將配置綁定到表示相關設置組的類。 有關更多信息,請參見ASP.NET Core 中的選項模式。
配置值作為字符串返回,但調(diào)用 Bind 可以構造 POCO 對象。 Bind 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。
示例應用包含 Starship 模型 (Models/Starship.cs):
C#
public class Starship
{
public string Name { get; set; }
public string Registry { get; set; }
public string Class { get; set; }
public decimal Length { get; set; }
public bool Commissioned { get; set; }
}
當示例應用使用 JSON 配置提供程序加載配置時,starship.json 文件的 starship 節(jié)會創(chuàng)建配置:
JSON
{
"starship": {
"name": "USS Enterprise",
"registry": "NCC-1701",
"class": "Constitution",
"length": 304.8,
"commissioned": false
},
"trademark": "Paramount Pictures Corp. http://www.paramount.com"
}
創(chuàng)建以下配置鍵值對:
鍵 | 值 |
---|---|
starship:name | USS Enterprise |
starship:registry | NCC-1701 |
starship:class | Constitution |
starship:length | 304.8 |
starship:commissioned | False |
trademark | Paramount Pictures Corp. http://www.paramount.com |
示例應用使用 starship 鍵調(diào)用 GetSection。 starship 鍵值對是獨立的。 在子節(jié)傳入 Starship類的實例時調(diào)用 Bind 方法。 綁定實例值后,將實例分配給用于呈現(xiàn)的屬性:
C#
var starship = new Starship();
_config.GetSection("starship").Bind(starship);
Starship = starship;
GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。
Bind 能夠綁定整個 POCO 對象圖。 Bind 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。
該示例包含 TvShow 模型,其對象圖包含 Metadata 和 Actors 類 (Models/TvShow.cs):
C#
public class TvShow
{
public Metadata Metadata { get; set; }
public Actors Actors { get; set; }
public string Legal { get; set; }
}
public class Metadata
{
public string Series { get; set; }
public string Title { get; set; }
public DateTime AirDate { get; set; }
public int Episodes { get; set; }
}
public class Actors
{
public string Names { get; set; }
}
示例應用有一個包含配置數(shù)據(jù)的 tvshow.xml 文件:
XML
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<tvshow>
<metadata>
<series>Dr. Who</series>
<title>The Sun Makers</title>
<airdate>11/26/1977</airdate>
<episodes>4</episodes>
</metadata>
<actors>
<names>Tom Baker, Louise Jameson, John Leeson</names>
</actors>
<legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>
</tvshow>
</configuration>
使用 Bind 方法將配置綁定到整個 TvShow 對象圖。 將綁定實例分配給用于呈現(xiàn)的屬性:
C#
var tvShow = new TvShow();
_config.GetSection("tvshow").Bind(tvShow);
TvShow = tvShow;
ConfigurationBinder.Get<T> 綁定并返回指定類型。 Get<T> 比使用 Bind 更方便。 以下代碼顯示如何將 Get<T> 與前面的示例一起使用,該示例允許將綁定實例直接分配給用于呈現(xiàn)的屬性:
C#
TvShow = _config.GetSection("tvshow").Get<TvShow>();
Get 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。ASP.NET Core 1.1 或更高版本中提供了 Get<T>。 GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。
示例應用演示了本部分中介紹的概念。
Bind 支持使用配置鍵中的數(shù)組索引將數(shù)組綁定到對象。 公開數(shù)字鍵段(:0:、:1:、… :{n}:)的任何數(shù)組格式都能夠與 POCO 類數(shù)組進行數(shù)組綁定。 `Bind`` 在 Microsoft.Extensions.Configuration.Binder 包中,后者在 Microsoft.AspNetCore.App 元包中。
備注
綁定是按約定提供的。 不需要自定義配置提供程序?qū)崿F(xiàn)數(shù)組綁定。
內(nèi)存中數(shù)組處理
請考慮下表中所示的配置鍵和值。
鍵 | 值 |
---|---|
array:entries:0 | value0 |
array:entries:1 | value1 |
array:entries:2 | value2 |
array:entries:4 | value4 |
array:entries:5 | value5 |
使用內(nèi)存配置提供程序在示例應用中加載這些鍵和值:
C#
public class Program
{
public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
{
{"array:entries:0", "value0"},
{"array:entries:1", "value1"},
{"array:entries:2", "value2"},
{"array:entries:4", "value4"},
{"array:entries:5", "value5"}
};
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddInMemoryCollection(arrayDict);
config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
config.AddCommandLine(args);
})
.UseStartup<Startup>();
}
該數(shù)組跳過索引 #3 的值。 配置綁定程序無法綁定 null 值,也無法在綁定對象中創(chuàng)建 null 條目,這在演示將此數(shù)組綁定到對象的結果時變得清晰。
在示例應用中,POCO 類可用于保存綁定的配置數(shù)據(jù):
C#
public class ArrayExample
{
public string[] Entries { get; set; }
}
將配置數(shù)據(jù)綁定至對象:
C#
var arrayExample = new ArrayExample();
_config.GetSection("array").Bind(arrayExample);
GetSection 在 Microsoft.Extensions.Configuration 包中,后者在 Microsoft.AspNetCore.App 元包中。
還可以使用 ConfigurationBinder.Get<T> 語法,從而產(chǎn)生更精簡的代碼:
C#
ArrayExample = _config.GetSection("array").Get<ArrayExample>();
綁定對象(ArrayExample 的實例)從配置接收數(shù)組數(shù)據(jù)。
ArrayExample.Entries 索引 | ArrayExample.Entries 值 |
---|---|
0 | value0 |
1 | value1 |
2 | value2 |
3 | value4 |
4 | value5 |
綁定對象中的索引 #3 保留 array:4 配置鍵的配置數(shù)據(jù)及其值 value4。 當綁定包含數(shù)組的配置數(shù)據(jù)時,配置鍵中的數(shù)組索引僅用于在創(chuàng)建對象時迭代配置數(shù)據(jù)。 無法在配置數(shù)據(jù)中保留 null 值,并且當配置鍵中的數(shù)組跳過一個或多個索引時,不會在綁定對象中創(chuàng)建 null 值條目。
可以在由任何在配置中生成正確鍵值對的配置提供程序綁定到 ArrayExample 實例之前提供索引 #3 的缺失配置項。 如果示例包含具有缺失鍵值對的其他 JSON 配置提供程序,則 ArrayExample.Entries 與完整配置數(shù)組相匹配:
missing_value.json:
JSON
{
"array:entries:3": "value3"
}
C#
config.AddJsonFile("missing_value.json", optional: false, reloadOnChange: false);
將表中所示的鍵值對加載到配置中。
鍵 | 值 |
---|---|
array:entries:3 | value3 |
如果在 JSON 配置提供程序包含索引 #3 的條目之后綁定 ArrayExample 類實例,則 ArrayExample.Entries 數(shù)組包含該值。
ArrayExample.Entries 索引 | ArrayExample.Entries 值 |
---|---|
0 | value0 |
1 | value1 |
2 | value2 |
3 | value3 |
4 | value4 |
5 | value5 |
JSON 數(shù)組處理
如果 JSON 文件包含數(shù)組,則會為具有從零開始的節(jié)索引的數(shù)組元素創(chuàng)建配置鍵。 在以下配置文件中,subsection 是一個數(shù)組:
JSON
{
"json_array": {
"key": "valueA",
"subsection": [
"valueB",
"valueC",
"valueD"
]
}
}
JSON 配置提供程序?qū)⑴渲脭?shù)據(jù)讀入以下鍵值對:
鍵 | 值 |
---|---|
json_array:key | valueA |
json_array:subsection:0 | valueB |
json_array:subsection:1 | valueC |
json_array:subsection:2 | valueD |
在示例應用中,以下 POCO 類可用于綁定配置鍵值對:
C#
public class JsonArrayExample
{
public string Key { get; set; }
public string[] Subsection { get; set; }
}
綁定后,JsonArrayExample.Key 保存值 valueA。 子節(jié)值存儲在 POCO 數(shù)組屬性 Subsection 中。
JsonArrayExample.Subsection 索引 | JsonArrayExample.Subsection 值 |
---|---|
0 | valueB |
1 | valueC |
2 | valueD |
該示例應用演示了如何使用實體框架 (EF) 創(chuàng)建從數(shù)據(jù)庫讀取配置鍵值對的基本配置提供程序。
提供程序具有以下特征:
定義用于在數(shù)據(jù)庫中存儲配置值的 EFConfigurationValue 實體。
Models/EFConfigurationValue.cs:
C#
public class EFConfigurationValue
{
public string Id { get; set; }
public string Value { get; set; }
}
添加 EFConfigurationContext 以存儲和訪問配置的值。
EFConfigurationProvider/EFConfigurationContext.cs:
C#
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values { get; set; }
}
創(chuàng)建用于實現(xiàn) IConfigurationSource 的類。
EFConfigurationProvider/EFConfigurationSource.cs:
C#
public class EFConfigurationSource : IConfigurationSource
{
private readonly Action<DbContextOptionsBuilder> _optionsAction;
public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction)
{
_optionsAction = optionsAction;
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new EFConfigurationProvider(_optionsAction);
}
}
通過從 ConfigurationProvider 繼承來創(chuàng)建自定義配置提供程序。 當數(shù)據(jù)庫為空時,配置提供程序?qū)ζ溥M行初始化。
EFConfigurationProvider/EFConfigurationProvider.cs:
C#
public class EFConfigurationProvider : ConfigurationProvider
{
public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
{
OptionsAction = optionsAction;
}
Action<DbContextOptionsBuilder> OptionsAction { get; }
// Load config data from EF DB.
public override void Load()
{
var builder = new DbContextOptionsBuilder<EFConfigurationContext>();
OptionsAction(builder);
using (var dbContext = new EFConfigurationContext(builder.Options))
{
dbContext.Database.EnsureCreated();
Data = !dbContext.Values.Any()
? CreateAndSaveDefaultValues(dbContext)
: dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
}
}
private static IDictionary<string, string> CreateAndSaveDefaultValues(
EFConfigurationContext dbContext)
{
// Quotes (c)2005 Universal Pictures: Serenity
// https://www.uphe.com/movies/serenity
var configValues = new Dictionary<string, string>
{
{ "quote1", "I aim to misbehave." },
{ "quote2", "I swallowed a bug." },
{ "quote3", "You can't stop the signal, Mal." }
};
dbContext.Values.AddRange(configValues
.Select(kvp => new EFConfigurationValue
{
Id = kvp.Key,
Value = kvp.Value
})
.ToArray());
dbContext.SaveChanges();
return configValues;
}
}
可以使用 AddEFConfiguration 擴展方法將配置源添加到 ConfigurationBuilder。
Extensions/EntityFrameworkExtensions.cs:
C#
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
下面的代碼演示如何在 Program.cs 中使用自定義的 EFConfigurationProvider:
C#
public class Program
{
public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
{
{"array:entries:0", "value0"},
{"array:entries:1", "value1"},
{"array:entries:2", "value2"},
{"array:entries:4", "value4"},
{"array:entries:5", "value5"}
};
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddInMemoryCollection(arrayDict);
config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
config.AddJsonFile("starship.json", optional: false, reloadOnChange: false);
config.AddXmlFile("tvshow.xml", optional: false, reloadOnChange: false);
config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
config.AddCommandLine(args);
})
.UseStartup<Startup>();
}
將 IConfiguration 注入 Startup 構造函數(shù)以訪問 Startup.ConfigureServices 中的配置值。 若要訪問 Startup.Configure 中的配置,請將 IConfiguration 直接注入方法或使用構造函數(shù)中的實例:
C#
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
_config = config;
}
public void ConfigureServices(IServiceCollection services)
{
var value = _config["key"];
}
public void Configure(IApplicationBuilder app, IConfiguration config)
{
var value = config["key"];
}
}
有關使用啟動便捷方法訪問配置的示例,請參閱應用啟動:便捷方法。
若要訪問 Razor Pages 頁或 MVC 視圖中的配置設置,請為 Microsoft.Extensions.Configuration 命名空間添加 using 指令(C# 參考:using 指令)并將 IConfiguration 注入頁面或視圖。
在 Razor 頁面頁中:
CSHTML
@page
@model IndexModel
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
<!DOCTYPE html>
<html lang="en">
<head>
<title>Index Page</title>
</head>
<body>
<h1>Access configuration in a Razor Pages page</h1>
<p>Configuration value for 'key': @Configuration["key"]</p>
</body>
</html>
在 MVC 視圖中:
CSHTML
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
<!DOCTYPE html>
<html lang="en">
<head>
<title>Index View</title>
</head>
<body>
<h1>Access configuration in an MVC view</h1>
<p>Configuration value for 'key': @Configuration["key"]</p>
</body>
</html>
通過 IHostingStartup 實現(xiàn),可在啟動時從應用 Startup 類之外的外部程序集向應用添加增強功能。有關更多信息,請參見在 ASP.NET Core 中使用承載啟動程序集。
更多建議: