應用程式設定
提示
本內容節錄自《Blazor for ASP NET Web Forms Developers for Azure》電子書,可以從 .NET Docs 取得,也可以免費下載 PDF 離線閱讀。
在 Web Forms 中載入應用程式組態的主要方式是使用 web.config 檔案中的項目,不論是在伺服器上,還是 web.config 所 參考的相關組態檔。您可以使用靜態 ConfigurationManager
物件來與應用程式設定、資料存放庫連接字串,以及其他新增至應用程式的擴充組態提供者進行互動。 通常會看到與應用程式設定的互動,如下列程式碼所示:
var configurationValue = ConfigurationManager.AppSettings["ConfigurationSettingName"];
var connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseConnectionName"].ConnectionString;
使用 ASP.NET Core 和伺服器端Blazor時,如果您的應用程式裝載於 Windows IIS 伺服器上,可能會有 web.config 檔案。 不過,此設定沒有任何ConfigurationManager
互動,而且您可以從其他來源接收更多結構化應用程式設定。 讓我們看看如何收集設定,以及如何從 web.config 檔案存取組態資訊。
組態來源
ASP.NET Core 可辨識許多您可能想要用於應用程式的設定來源。 根據預設,本架構會嘗試提供您這些最佳的功能。 設定會依 ASP.NET Core 從這些各種來源讀取和彙總。 稍後針對相同設定索引鍵載入的值優先於先前的值。
ASP.NET Core 設計成雲端感知,並讓操作員和開發人員更容易設定應用程式。 ASP.NET Core 是環境感知,並知道這是否在Production
或Development
環境中執行。 環境指標是在ASPNETCORE_ENVIRONMENT
系統環境變數中設定。 如果未設定任何值,應用程式預設會在Production
環境中執行。
您的應用程式可以根據環境的名稱,從數個來源觸發和新增設定。 根據預設,本設定會依列出的順序從下列資源載入:
- appsettings.json 檔案 (如果有的話)
- appsettings.{ENVIRONMENT_NAME}.json 檔案 (如果有的話)
- 磁碟上的使用者祕密檔案 (如果有的話)
- 環境變數
- 命令列引數
appsettings.json 格式和存取
appsettings.json 檔案可以是階層式檔案,其中的結構類似下列 JSON:
{
"section0": {
"key0": "value",
"key1": "value"
},
"section1": {
"key0": "value",
"key1": "value"
}
}
呈現上述 JSON 時,設定系統會扁平化子值,並參考其中的完整階層式路徑。 冒號 (:
) 字元會分隔階層中的每個屬性。 例如,設定索引鍵section1:key0
會存取section1
物件常值的key0
值。
使用者祕密
使用者祕密如下:
- 儲存在開發人員工作站上的 JSON 檔案中的設定值,位於應用程式開發資料夾之外。
- 只有在
Development
環境中執行時才會載入。 - 與特定應用程式相關聯。
- 使用 .NET CLI 的
user-secrets
命令進行管理。
執行user-secrets
命令來設定您的應用程式以儲存祕密:
dotnet user-secrets init
上述命令會將UserSecretsId
元素新增至專案檔。 元素包含 GUID,用來將祕密與應用程式產生關聯。 接著,您可以使用set
命令來定義祕密。 例如:
dotnet user-secrets set "Parent:ApiKey" "12345"
上述命令會讓Parent:ApiKey
設定金鑰可在開發人員的工作站上使用,其值為12345
。
如需建立、儲存和管理使用者祕密的詳細資訊,請參閱在開發環境中安全地在 ASP.NET Core 中儲存應用程式祕密文件。
環境變數
載入應用程式設定的下一組值是系統的環境變數。 您所有的系統內容變數設定現在都可透過設定 API 存取。 在應用程式內讀取時,會將階層式值壓平合併並以冒號字元分隔。 不過,某些作業系統不允許冒號字元環境變數名稱。 ASP.NET Core 會將有雙底線的值 (__
) 轉換成冒號,以解決這項限制。 上述使用者祕密區段的Parent:ApiKey
值可以使用環境變數Parent__ApiKey
覆寫。
命令列引數
您的應用程式啟動時,也能夠以命令列引數的形式提供設定。 使用雙虛線 (--
) 或正斜線 (/
) 標記法來表示要設定的設定值名稱和要設定的值。 語法類似下列命令:
dotnet run CommandLineKey1=value1 --CommandLineKey2=value2 /CommandLineKey3=value3
dotnet run --CommandLineKey1 value1 /CommandLineKey2 value2
dotnet run Parent:ApiKey=67890
web.config 的傳回
如果您已將應用程式部署至 IIS 上的 Windows,web.config 檔案仍會將 IIS 設定為管理您的應用程式。 根據預設,IIS 會將參考新增至 ASP.NET Core Module (ANCM)。 ANCM 是原生 IIS 模組,可裝載您的應用程式來取代 Kestrel 網頁伺服器。 此 web.config 區段類似下列 XML 標記:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath=".\MyApp.exe"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
hostingModel="inprocess" />
</system.webServer>
</location>
</configuration>
應用程式特定的設定可以藉由將aspNetCore
元素中的environmentVariables
元素進行巢狀處理來加以定義。 本節中定義的值會以環境變數的形式呈現在 ASP.NET Core 應用程式。 環境變數會在應用程式啟動的該區段期間適當載入。
<aspNetCore processPath="dotnet"
arguments=".\MyApp.dll"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout"
hostingModel="inprocess">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
<environmentVariable name="Parent:ApiKey" value="67890" />
</environmentVariables>
</aspNetCore>
讀取應用程式中的設定
ASP.NET Core 透過IConfiguration介面提供應用程式設定。 您的Blazor元件、Blazor頁面以及需要存取設定的其他任何 ASP.NET Core 管理類別都應該要求此設定介面。 ASP.NET Core 架構會自動將此介面填入稍早設定的已解析設定。 在Blazor頁面或元件的 Razor 標記上,您可以將IConfiguration
物件與@inject
指示詞插入 .razor 檔案頂端,如下所示:
@inject IConfiguration Configuration
上述陳述式可讓IConfiguration
物件在整個 Razor 範本的其餘部分以Configuration
變數的形式提供。
您可以藉由指定搜尋,為索引子參數的組態設定階層讀取個別組態設定:
var mySetting = Configuration["section1:key0"];
您可以使用GetSection方法來擷取特定位置的索引鍵集合,其語法類似於GetSection("section1")
從先前範例擷取 section1 的設定,以擷取整個設定區段。
強型別設定
透過 Web Form,可以建立繼承自ConfigurationSection型別和相關聯型別的強型別設定型別。 ConfigurationSection
可讓您為這些設定值設定一些商務規則和處理。
在 ASP.NET Core 中,您可以指定將接收設定值的類別階層。 這些類別:
- 不需要從父代類別繼承。
- 應該包含與您想要擷取設定結構所用屬性和型別參考相符的
public
屬性。
針對先前的 appsettings.json 範例,您可以定義下列類別來擷取值:
public class MyConfig
{
public MyConfigSection section0 { get; set;}
public MyConfigSection section1 { get; set;}
}
public class MyConfigSection
{
public string key0 { get; set; }
public string key1 { get; set; }
}
可以將下列這一行新增至Startup.ConfigureServices
方法 (或 Program.cs 中的適當位置,使用builder.Services
屬性而非services
) 以填入此類別階層:
services.Configure<MyConfig>(Configuration);
在應用程式的其餘部分,您可以將輸入參數新增至型別IOptions<MyConfig>
的類別或 Razor 範本中的@inject
指示詞,以接收強型別組態設定。 IOptions<MyConfig>.Value
屬性會暫止從組態設定填入的MyConfig
值。
@inject IOptions<MyConfig> options
@code {
var MyConfiguration = options.Value;
var theSetting = MyConfiguration.section1.key0;
}
如需選項功能的詳細資訊,請參閱ASP.NET Core 中的選項模式文件。