關於Asp.Net Core中的配置實際之前我已經整理過.net 中以json方式進行配置的介紹(.net 溫故知新:【8】.NET 中的配置從xml轉向json),當時我們說Asp.Net Core也是按照基礎方法,只是組織形式的問題,有個封裝過程。所以我這裏就着重介紹一下Asp.Net Core中配置的重點。
1、主機配置和應用程序配置
ASP.NET Core 應用配置和啓動“主機”。 主機負責應用程序啓動和生存期管理。 ASP.NET Core 模板創建的 WebApplicationBuilder 包含主機。 雖然可以在主機和應用程序配置提供程序中完成一些配置,但通常,只有主機必需的配置才應在主機配置中完成。
主機配置和應用程序配置是什麼意思呢,可以粗略的理解爲我們ASP.NET Core 項目啓動的時候要用到的一些配置爲主機配置,而程序運行階段使用的配置爲應用程序配置。
而ASP.NET Core 包含一些默認的主機和應用程序配置,我們先看看這些默認配置在哪裏以及配置的規範。
2、默認主機配置
從文檔描述可以看到,默認主機配置是的優先級爲:
命令行-> DOTNET_ 爲前綴的環境變量->ASPNETCORE_ 爲前綴的環境變量
並且部分變量是鎖定在啓動階段,不受其他配置的影響:
命令行可以通過啓動程序設置,比如:dotnet run --environment Production
而其他的則可以直接設置系統環境變量,並且按照前綴優先。由於去系統設置比較麻煩,且設置後可能還需要重啓VS,所以提供一些能便捷設置的能力。
launchSettings.json
僅在本地開發計算機上使用,包含配置文件設置。可以設置啓動方式和相應的環境變量。
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:21115",
"sslPort": 44325
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5007",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7211;http://localhost:5007",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
如上是創建項目默認的launchSettings.json文件,在文件中對https、http、IIS Express等配置的ASPNETCORE_ENVIRONMENT
都爲Development
。
ENVIRONMENT
可以配置任意值,框架提供了Development、Staging、Production三種,當沒有設置 DOTNET_ENVIRONMENT 和 ASPNETCORE_ENVIRONMENT 時的默認值爲Production。
這就是爲什麼我們不在開發工具中調試,而是直接運行項目的時候會是Production。
同時我們如果要自己設置其他值,那麼項目中對於使用的地方也要注意,比如appsettings.{Environment}.json
文件名,這個我們稍後講。
這個值在Program.cs中是最好的體現,當是Development時啓用swagger:
3、默認應用程序配置
默認應用程序配置是的優先級爲:
命令行-> 非前綴的環境變量->Development環境中用戶機密配置->appsettings.{Environment}.json-> appsettings.json->主機配置(非鎖定)
命令行配置和非前綴環境變量不用說了,接着就是用戶機密文件,稍後我們單獨說下機密文件。
然後再加載appsettings.{Environment}.json文件,這個文件是根據上面主機配置的環境變量ENVIRONMENT
加載的,比如你配置ENVIRONMENT=AA,那麼json文件應爲appsettings.AA.json。
當讀取了環境變量的json後就讀取appsettings.json文件,該文件一般是正式部署中使用。
最後就是主機配置相關的變量,這部分優先級比較高。
(注意:這些配置的讀取由配置提供程序
實現,也就決定了他們不同的功能或者實現,提供程序這個概念和設計是.net 中大面積使用的,可以從這個部分去理解)
4、配置機密文件
機密管理器工具可用於存儲開發環境中的機密,比如開發過程中用到的一些數據庫配置,這個機密文件不在項目目錄下,所以不會被上傳到代碼管理工具,例如git或者svn。
右鍵項目->管理用戶機密
我們看到這個文件是在C盤下,而且文件夾名是一串編碼,該編碼在項目文件中已經自動配置好了。
5、使用配置
使用依賴注入的方式將IConfiguration
注入,之後我們寫一個測試獲取上面我們配置的用戶機密文件裏面SecretKey
的值。
namespace WebAPI_Config.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
private IConfiguration _configuration;
public TestController(IConfiguration configuration)
{
_configuration = configuration;
}
[HttpGet]
public string Get()
{
return _configuration.GetValue(typeof(string), "SecretKey").ToString();
}
}
}
如果對依賴注入不瞭解的可以看看我的另外一篇:.net 溫故知新:【7】IOC控制反轉,DI依賴注入
測試接口可以看到已經獲取到了對應的值。