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

XSpringSun發表於2023-12-08

關於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

相關文章