.net 溫故知新【15】:Asp.Net Core WebAPI 配置

關於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、默認主機配置

image

從文檔描述可以看到,默認主機配置是的優先級爲:

命令行-> DOTNET_ 爲前綴的環境變量->ASPNETCORE_ 爲前綴的環境變量

並且部分變量是鎖定在啓動階段,不受其他配置的影響:

image

命令行可以通過啓動程序設置,比如: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:

image

3、默認應用程序配置

image

默認應用程序配置是的優先級爲:

命令行-> 非前綴的環境變量->Development環境中用戶機密配置->appsettings.{Environment}.json-> appsettings.json->主機配置(非鎖定)

命令行配置和非前綴環境變量不用說了,接着就是用戶機密文件,稍後我們單獨說下機密文件。

然後再加載appsettings.{Environment}.json文件,這個文件是根據上面主機配置的環境變量ENVIRONMENT加載的,比如你配置ENVIRONMENT=AA,那麼json文件應爲appsettings.AA.json。

image

當讀取了環境變量的json後就讀取appsettings.json文件,該文件一般是正式部署中使用。

最後就是主機配置相關的變量,這部分優先級比較高。

(注意:這些配置的讀取由配置提供程序實現,也就決定了他們不同的功能或者實現,提供程序這個概念和設計是.net 中大面積使用的,可以從這個部分去理解)

4、配置機密文件

機密管理器工具可用於存儲開發環境中的機密,比如開發過程中用到的一些數據庫配置,這個機密文件不在項目目錄下,所以不會被上傳到代碼管理工具,例如git或者svn。

右鍵項目->管理用戶機密
image

我們看到這個文件是在C盤下,而且文件夾名是一串編碼,該編碼在項目文件中已經自動配置好了。
image

image

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依賴注入

測試接口可以看到已經獲取到了對應的值。
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章