小提示
本內容節錄自《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 核心模組 (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>
您可以透過將environmentVariables
元素巢狀於aspNetCore
元素中,來定義應用程式特定的設定。 本節中定義的值會以環境變數的形式呈現給 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
檔案頂端注入 物件,如下所示:
@inject IConfiguration Configuration
上述語句使 IConfiguration
對象在 Razor 範本的其餘部分中作為 Configuration
變數使用。
藉由指定搜尋的組態設定階層做為索引器參數,即可讀取個別組態設定:
var mySetting = Configuration["section1:key0"];
您可以使用 GetSection 方法來擷取整個組態區段,透過類似 GetSection("section1")
的語法,在特定位置檢索一組索引鍵,從先前範例中擷取 section1 的組態。
強型別組態
在使用 Web Forms 時,可以建立一個強型別的組態類型,這個類型繼承自 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);
在應用程式的其他部分,您可以將輸入參數新增至類別,或在類型為 @inject
的 Razor 範本中新增 IOptions<MyConfig>
指令,以接收強型別組態設定。 屬性 IOptions<MyConfig>.Value
會產生 MyConfig
從組態設定填入的值。
@inject IOptions<MyConfig> options
@code {
var MyConfiguration = options.Value;
var theSetting = MyConfiguration.section1.key0;
}
如需 [選項] 功能的詳細資訊,請參閱 ASP.NET Core 檔中的 [ 選項] 模式 。