ASP.NET Core 的設定

Rick AndersonKirk Larkin

ASP.NET Core 中的設定是使用一或多個設定提供者來執行。 設定提供者會使用各種設定來源從機碼值組讀取設定資料:

  • 設定檔案,例如 appsettings.json
  • 環境變數
  • Azure 金鑰保存庫
  • Azure 應用程式組態
  • 命令列引數
  • 自訂提供者、已安裝或已建立
  • 目錄檔案
  • 記憶體內部 .NET 物件

本主題提供 ASP.NET Core 中設定的相關資訊。 如需在主控台應用程式中使用設定的詳細資訊,請參閱 .net設定。

查看或下載範例程式碼 (如何下載)

預設組態

ASP.NET Core 使用dotnet new或 Visual Studio 建立的 web 應用程式會產生下列程式碼:

var builder = WebApplication.CreateBuilder(args);

CreateBuilder 會以下列順序提供應用程式的預設組態:

  1. ChainedConfigurationProvider :加入現有的 IConfiguration 作為來源。 在預設設定案例中,新增 主機 設定,並將其設定為 應用程式 設定的第一個來源。
  2. appsettings.json 使用 JSON 設定提供者
  3. appsettings。 Environment使用 json 設定提供者json。 例如, appsettings生產 * * _._jsonappsettings。 * * * 開發 _._json *。
  4. 應用程式在環境中執行時的應用程式秘密 Development
  5. 使用 環境變數設定提供者的環境變數。
  6. 使用 命令列設定提供者的命令列引數。

稍後新增的設定提供者會覆寫先前的金鑰設定。 例如,如果 MyKey 在和環境中設定 appsettings.json ,則會使用環境值。 使用預設的設定提供者, 命令列設定提供者 會覆寫所有其他提供者。

如需的詳細資訊 CreateBuilder ,請參閱 預設 builder 設定

下列程式碼會依新增的順序顯示已啟用的設定提供者:

public class Index2Model : PageModel
{
    private IConfigurationRoot ConfigRoot;

    public Index2Model(IConfiguration configRoot)
    {
        ConfigRoot = (IConfigurationRoot)configRoot;
    }

    public ContentResult OnGet()
    {           
        string str = "";
        foreach (var provider in ConfigRoot.Providers.ToList())
        {
            str += provider.ToString() + "\n";
        }

        return Content(str);
    }
}

appsettings.json

請考慮下列檔案 appsettings.json

{
    "Position": {
        "Title": "編輯器",
        "Name": "Joe Smith"
    },
    "MyKey": "My appsettings.json Value",
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

範例下載中的下列程式碼會顯示上述幾個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

預設會 JsonConfigurationProvider 以下列順序載入設定:

  1. appsettings.json
  2. appsettings。 Environment. json :例如 appsettings生產 * * _._jsonappsettings* * * 開發 _._json * 檔案。 檔案的環境版本是根據 IHostingEnvironment EnvironmentName載入。 如需詳細資訊,請參閱在 ASP.NET Core 中使用多個環境

appsettings... Environmentjson 值會覆寫中的索引鍵 appsettings.json 。 例如,根據預設:

  • 在開發期間, appsettings. *開發 _._json * 設定會覆寫在中找到的值 appsettings.json
  • 在生產環境中, appsettings. *生產 _._json * 設定會覆寫在中找到的值 appsettings.json 。 例如,將應用程式部署至 Azure 時。

如果必須保證設定值,請參閱 GetValue。 上述範例只會讀取字串,且不支援預設值。

使用 預設設定, appsettings.json 以及 appsettings。 Environment已啟用 reloadOnChange: truejson 檔案。 對和 appsettings 進行的變更 appsettings.json Environmentjson 設定 提供者會讀取應用程式啟動 json 檔案。

使用選項模式系結階層式設定資料

讀取相關設定值的慣用方式是使用 選項模式。 例如,若要讀取下列設定值:

  "Position": {
    "Title": "Editor",
    "Name": "Joe Smith"
  }

建立下列 PositionOptions 類別:

public class PositionOptions
{
    public const string Position = "Position";

    public string Title { get; set; } = String.Empty;
    public string Name { get; set; } = String.Empty;
}

Options 類別:

  • 必須是具有公用無參數的函式的非抽象。
  • 型別的所有公用讀寫屬性都會系結。
  • 欄位 系結。 在上述程式碼中,未系結 Position 。 使用屬性,因此在將類別系結 Position "Position" 至設定提供者時,不需要在應用程式中硬式編碼字串。

下列程式碼:

  • 呼叫 ConfigurationBinder ,將類別系結至 PositionOptions Position 區段。
  • 顯示 Position 設置資料。
public class Test22Model : PageModel
{
    private readonly IConfiguration Configuration;

    public Test22Model(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var positionOptions = new PositionOptions();
        Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);

        return Content($"Title: {positionOptions.Title} \n" +
                       $"Name: {positionOptions.Name}");
    }
}

在上述程式碼中,預設會讀取應用程式啟動後的 JSON 設定檔變更。

ConfigurationBinder.Get<T> 系結並傳回指定的型別。 ConfigurationBinder.Get<T> 可能比使用更方便 ConfigurationBinder.Bind 。 下列程式碼顯示如何搭配 ConfigurationBinder.Get<T> PositionOptions 類別使用:

public class Test21Model : PageModel
{
    private readonly IConfiguration Configuration;
    public PositionOptions? positionOptions { get; private set; }

    public Test21Model(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {            
        positionOptions = Configuration.GetSection(PositionOptions.Position)
                                                     .Get<PositionOptions>();

        return Content($"Title: {positionOptions.Title} \n" +
                       $"Name: {positionOptions.Name}");
    }
}

在上述程式碼中,預設會讀取應用程式啟動後的 JSON 設定檔變更。

使用 *選項模式 _ 的替代方法是系結 Position 區段,並將它加入至相依性 插入服務容器。 在下列程式碼中, PositionOptions 會新增至服務容器, <xref:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure_> 並系結至設定:

using ConfigSample.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.Configure<PositionOptions>(
    builder.Configuration.GetSection(PositionOptions.Position));

var app = builder.Build();

使用上述程式碼,下列程式碼會讀取位置選項:

public class Test2Model : PageModel
{
    private readonly PositionOptions _options;

    public Test2Model(IOptions<PositionOptions> options)
    {
        _options = options.Value;
    }

    public ContentResult OnGet()
    {
        return Content($"Title: {_options.Title} \n" +
                       $"Name: {_options.Name}");
    }
}

在上述程式碼中, 會讀取應用程式啟動後的 JSON 設定檔變更。 若要讀取應用程式啟動後的變更,請使用 IOptionsSnapshot

使用 預設設定, appsettings.json 以及 appsettings。 Environment已啟用 reloadOnChange: truejson 檔案。 對和 appsettings 進行的變更 appsettings.json Environmentjson 設定 提供者會讀取應用程式啟動 json 檔案。

如需新增其他 JSON 設定檔的相關資訊,請參閱本檔中的 json 設定提供者

合併服務集合

請考慮下列 ConfigureServices 方法,它會註冊服務並設定選項:

using ConfigSample.Options;
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.Configure<PositionOptions>(
    builder.Configuration.GetSection(PositionOptions.Position));
builder.Services.Configure<ColorOptions>(
    builder.Configuration.GetSection(ColorOptions.Color));

builder.Services.AddScoped<IMyDependency, MyDependency>();
builder.Services.AddScoped<IMyDependency2, MyDependency2>();

var app = builder.Build();

您可以將相關的註冊群組移至擴充方法,以註冊服務。 例如,設定服務會新增至下列類別:

using ConfigSample.Options;
using Microsoft.Extensions.Configuration;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class MyConfigServiceCollectionExtensions
    {
        public static IServiceCollection AddConfig(
             this IServiceCollection services, IConfiguration config)
        {
            services.Configure<PositionOptions>(
                config.GetSection(PositionOptions.Position));
            services.Configure<ColorOptions>(
                config.GetSection(ColorOptions.Color));

            return services;
        }
    }
}

其餘的服務會註冊在類似的類別中。 下列 ConfigureServices 方法會使用新的擴充方法來註冊服務:

using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Services
    .AddConfig(builder.Configuration)
    .AddMyDependencyGroup();

builder.Services.AddRazorPages();

var app = builder.Build();

注意: 每個 services.Add{GROUP_NAME} 擴充方法會新增並可能設定服務。 例如, AddControllersWithViews 新增具有 views 需求的服務 MVC 控制器,並 AddRazorPages 新增服務頁面所 Razor 需的服務。 建議應用程式遵循在命名空間中建立擴充方法的命名慣例 Microsoft.Extensions.DependencyInjection 。 在命名空間中建立擴充方法 Microsoft.Extensions.DependencyInjection

  • 封裝服務註冊的群組。
  • 提供對服務的方便 IntelliSense 存取。

安全性與使用者秘密

設定資料指導方針:

  • 永遠不要將密碼或其他敏感性資料儲存在設定提供者程式碼或純文字設定檔中。 秘密管理員工具可以用來在開發中儲存秘密。
  • 不要在開發或測試環境中使用生產環境祕密。
  • 請在專案外部指定祕密,以防止其意外認可至開放原始碼存放庫。

根據 預設,使用者秘密設定來源會在 JSON 設定來源之後註冊。 因此,使用者秘密金鑰優先于和 appsettings 中的金鑰 appsettings.json Environment. json

如需有關儲存密碼或其他敏感性資料的詳細資訊:

Azure Key Vault 可安全地儲存 ASP.NET Core 應用程式的應用程式祕密。 如需詳細資訊,請參閱ASP.NET Core 中的 Azure Key Vault 設定提供者

環境變數

使用 預設設定時,會在 EnvironmentVariablesConfigurationProvider 讀取之後從環境變數機碼值組載入設定 appsettings.jsonappsettings)。 Environment. json使用者秘密。 因此,從環境讀取的索引鍵值會覆寫 appsettings 中讀取的值 appsettings.json Environment. json 和使用者秘密。

:分隔符號不適用於所有平臺上的環境變數階層式索引鍵。 __(雙底線)為:

  • 所有平臺都支援。 例如, : Bash不支援分隔符號,但 __ 為。
  • 自動取代為 :

下列 set 命令:

  • 在 Windows 上設定上述範例的環境索引鍵和值。
  • 使用 範例下載時,測試設定。 dotnet run命令必須在專案目錄中執行。
set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run

先前的環境設定:

  • 只會在從其設定的命令視窗啟動的進程中設定。
  • 使用 Visual Studio 啟動的瀏覽器將無法讀取。

您可以使用下列的setx命令,在 Windows 設定環境機碼和值。 與不同 setsetx 是,設定會持續保存。 /M 設定系統內容中的變數。 如果 /M 未使用此參數,則會設定使用者環境變數。

setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M

若要測試上述命令是否覆寫 appsettings.jsonappsettings。 Environment. json

  • 使用 Visual Studio: Exit 並重新啟動 Visual Studio。
  • 使用 CLI:啟動新的命令視窗,然後輸入 dotnet run

AddEnvironmentVariables使用字串呼叫以指定環境變數的前置詞:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");

var app = builder.Build();

在上述程式碼中:

  • config.AddEnvironmentVariables(prefix: "MyCustomPrefix_") 會在預設設定 提供者之後加入。 如需排序設定提供者的範例,請參閱 JSON 設定提供者
  • 具有前置詞的環境變數會覆 MyCustomPrefix_ 寫預設的設定 提供者。 這包括沒有前置詞的環境變數。

讀取設定機碼值組時,會移除前置詞。

下列命令會測試自訂前置詞:

set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run

預設設定會載入前面加上和的環境變數和命令列引數 DOTNET_ ASPNETCORE_ 。 和前置詞 DOTNET_ ASPNETCORE_ 是由 ASP.NET Core 用於主機和應用程式設定,但不適用於使用者設定。 如需有關主機和應用程式設定的詳細資訊,請參閱 .Net 泛型主機

Azure App Service上,選取 [設定 > 設定] 頁面上的 [新增應用程式設定]。 Azure App Service 的應用程式設定如下:

  • 靜態加密,並透過加密通道傳輸。
  • 公開為環境變數。

如需詳細資訊,請參閱 Azure App:使用 Azure 入口網站覆寫應用程式設定

如需 Azure 資料庫連接字串的相關資訊,請參閱 連接字串 前置詞。

環境變數的命名

環境變數名稱會反映檔案的結構 appsettings.json 。 階層中的每個元素會以雙底線分隔 (偏好) 或冒號。 當元素結構包含陣列時,應該將陣列索引視為這個路徑中的其他元素名稱。 請考慮下列檔案 appsettings.json 及其對等的值(以環境變數表示)。

appsettings.json

{
    "SmtpServer": "smtp.example.com",
    "Logging": [
        {
            "Name": "ToEmail",
            "Level": "Critical",
            "Args": {
                "FromAddress": "MySystem@example.com",
                "ToAddress": "SRE@example.com"
            }
        },
        {
            "Name": "ToConsole",
            "Level": "Information"
        }
    ]
}

環境變數

setx SmtpServer=smtp.example.com
setx Logging__0__Name=ToEmail
setx Logging__0__Level=Critical
setx Logging__0__Args__FromAddress=MySystem@example.com
setx Logging__0__Args__ToAddress=SRE@example.com
setx Logging__1__Name=ToConsole
setx Logging__1__Level=Information

在產生的 Launchsettings.json 中設定的環境變數

launchsettings.json 中設定的環境變數會覆寫系統內容中所設定的環境變數。 例如,ASP.NET Core web 範本會產生 launchsettings.json 檔案,將端點設定設定為:

"applicationUrl": "https://localhost:5001;http://localhost:5000"

設定會 applicationUrl 設定 ASPNETCORE_URLS 環境變數,並覆寫環境中設定的值。

在 Linux 上的 Escape 環境變數

在 Linux 上,必須將 URL 環境變數的值換成 systemd 可加以剖析。 使用產生的 linux 工具 systemd-escape``http:--localhost:5001

groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001

顯示環境變數

下列程式碼會顯示應用程式啟動時的環境變數和值,這在進行環境設定的偵錯工具時很有用:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

var config = app.Services.GetRequiredService<IConfiguration>();

foreach (var c in config.AsEnumerable())
{
    Console.WriteLine(c.Key + " = " + c.Value);
}

命令列

使用 預設 設定時,會 CommandLineConfigurationProvider 從命令列引數索引鍵/值組在下列設定來源之後載入設定:

  • appsettings.jsonappsettingsEnvironmentjson 檔案。
  • 開發環境中的應用程式秘密
  • 環境變數。

根據 預設,在命令列覆寫設定值設定的設定值會與所有其他設定提供者一起設定。

命令列引數

下列命令會使用下列命令來設定索引鍵和值 =

dotnet run MyKey="My key from command line" Position:Title=Cmd Position:Name=Cmd_Rick

下列命令會使用下列命令來設定索引鍵和值 /

dotnet run /MyKey "Using /" /Position:Title=Cmd_ /Position:Name=Cmd_Rick

下列命令會使用下列命令來設定索引鍵和值 --

dotnet run --MyKey "Using --" --Position:Title=Cmd-- --Position:Name=Cmd--Rick

索引鍵值:

  • 必須遵循 = ,或者 -- / 當值在空格後面時,索引鍵必須有或的前置詞。
  • 如果 = 使用,則不需要。 例如: MySetting=

在相同的命令中,不要混用 = 與使用空格的索引鍵/值組搭配使用的命令列引數索引鍵/值配對。

切換對應

交換器對應允許索引 名稱取代邏輯。 為方法提供切換取代的字典 AddCommandLine

使用切換對應字典時,會檢查字典中是否有任何索引鍵符合命令列引數所提供的索引鍵。 如果在字典中找到命令列索引鍵,則會傳回字典值以將索引鍵/值組設定為應用程式的設定。 所有前面加上單虛線 (-) 的命令列索引鍵都需要切換對應。

切換對應字典索引鍵規則:

  • 參數的開頭必須是 ---
  • 切換對應字典不能包含重複索引鍵。

若要使用切換對應字典,請將它傳遞到的呼叫中 AddCommandLine


var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

var switchMappings = new Dictionary<string, string>()
         {
             { "-k1", "key1" },
             { "-k2", "key2" },
             { "--alt3", "key3" },
             { "--alt4", "key4" },
             { "--alt5", "key5" },
             { "--alt6", "key6" },
         };

builder.Configuration.AddCommandLine(args, switchMappings);

var app = builder.Build();

執行下列命令以測試金鑰取代:

dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6

下列程式碼顯示已取代金鑰的索引鍵值:

public class Test3Model : PageModel
{
    private readonly IConfiguration Config;

    public Test3Model(IConfiguration configuration)
    {
        Config = configuration;
    }

    public ContentResult OnGet()
    {
        return Content(
                $"Key1: '{Config["Key1"]}'\n" +
                $"Key2: '{Config["Key2"]}'\n" +
                $"Key3: '{Config["Key3"]}'\n" +
                $"Key4: '{Config["Key4"]}'\n" +
                $"Key5: '{Config["Key5"]}'\n" +
                $"Key6: '{Config["Key6"]}'");
    }
}

針對使用切換對應的應用程式,呼叫 CreateDefaultBuilder 不應傳遞引數。 CreateDefaultBuilder方法的 AddCommandLine 呼叫不包含對應的參數,而且沒有任何方法可將切換對應字典傳遞給 CreateDefaultBuilder 。 解決方案不會將引數傳遞至, CreateDefaultBuilder 而是會允許 ConfigurationBuilder 方法的 AddCommandLine 方法處理引數和切換對應字典。

使用 Visual Studio 設定環境和命令列引數

您可以在 [啟動設定檔] 對話方塊的 Visual Studio 中設定環境和命令列引數:

  • 在方案總管中,以滑鼠右鍵按一下專案並選取 [ 屬性]。
  • 選取 [ debug > 一般 ] 索引標籤,然後選取 [ 開啟 debug 啟動設定檔 UI]。

階層式設定資料

設定 API 會透過使用設定金鑰中的分隔符號來簡維階層式資料,以讀取階層式設定資料。

範例下載包含下列檔案 appsettings.json

{
    "Position": {
        "Title": "編輯器",
        "Name": "Joe Smith"
    },
    "MyKey": "My appsettings.json Value",
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

範例下載中的下列程式碼會顯示數個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

讀取階層式設定資料的慣用方式是使用選項模式。 如需詳細資訊,請參閱本檔中的系結階層式設定 資料

GetSectionGetChildren 方法可用來在設定資料中隔離區段與區段的子系。 GetSection,、 GetChildren 與 Exists 中說明這些方法。

設定機碼和值

設定金鑰:

  • 不區分大小寫。 例如,ConnectionStringconnectionstring 會被視為相等的機碼。
  • 如果在多個設定提供者中設定索引鍵和值,則會使用最後新增的提供者所提供的值。 如需詳細資訊,請參閱 預設設定。
  • 階層式機碼
    • 在設定 API 內,冒號分隔字元 (:) 可在所有平台上運作。
    • 在環境變數中,冒號分隔字元可能無法在所有平台上運作。 所有平臺都支援雙底線、 __ ,而且會自動轉換為冒號 :
    • 在 Azure Key Vault 中,階層式索引鍵會使用 -- 做為分隔符號。 -- : 當秘密載入至應用程式的設定時,Azure Key Vault 設定提供者會自動取代為。
  • ConfigurationBinder 支援在設定機碼中使用陣列索引將陣列繫結到物件。 將陣列繫結到類別一節說明陣列繫結。

設定值:

  • 為字串。
  • Null 值無法存放在設定中或繫結到物件。

設定提供者

下表顯示可供 ASP.NET Core 應用程式使用的設定提供者。

提供者 從提供設定
Azure Key Vault 設定提供者 Azure 金鑰保存庫
Azure App 設定提供者 Azure 應用程式組態
命令列設定提供者 命令列參數
自訂設定提供者 自訂來源
環境變數設定提供者 環境變數
檔案設定提供者 INI、JSON 和 XML 檔案
每個檔案的金鑰配置提供者 目錄檔案
記憶體設定提供者 記憶體內集合
使用者祕密 使用者設定檔目錄中的檔案

設定來源會依照其設定提供者的指定順序讀取。 在程式碼中訂購設定提供者,以符合應用程式所需之基礎設定來源的優先順序。

典型的設定提供者順序是:

  1. appsettings.json
  2. appsettings... Environmentjson
  3. 使用者祕密
  4. 使用 環境變數設定提供者的環境變數。
  5. 使用 命令列設定提供者的命令列引數。

常見的作法是將命令列設定提供者新增至一系列的提供者,以允許命令列引數覆寫其他提供者所設定的設定。

先前的提供者序列會用於 預設設定中。

連接字串前置詞

設定 API 有四個連接字串環境變數的特殊處理規則。 這些連接字串涉及設定應用程式環境的 Azure 連接字串。 具有資料表中所顯示前置詞的環境變數會以 預設 設定載入至應用程式,或不提供任何前置詞 AddEnvironmentVariables

連接字串前置詞 提供者
CUSTOMCONNSTR_ 自訂提供者
MYSQLCONNSTR_ MySQL
SQLAZURECONNSTR_ Azure SQL Database
SQLCONNSTR_ SQL Server

當探索到具有下表所顯示之任何四個前置詞的環境變數並將其載入到設定中時:

  • 會透過移除環境變數前置詞並新增設定機碼區段 (ConnectionStrings) 來移除具有下表顯示之前置詞的環境變數。
  • 會建立新的設定機碼值組以代表資料庫連線提供者 (CUSTOMCONNSTR_ 除外,這沒有所述提供者)。
環境變數機碼 已轉換的設定機碼 提供者設定項目
CUSTOMCONNSTR_{KEY} ConnectionStrings:{KEY} 設定項目未建立。
MYSQLCONNSTR_{KEY} ConnectionStrings:{KEY} 機碼:ConnectionStrings:{KEY}_ProviderName
值:MySql.Data.MySqlClient
SQLAZURECONNSTR_{KEY} ConnectionStrings:{KEY} 機碼:ConnectionStrings:{KEY}_ProviderName
值:System.Data.SqlClient
SQLCONNSTR_{KEY} ConnectionStrings:{KEY} 機碼:ConnectionStrings:{KEY}_ProviderName
值:System.Data.SqlClient

檔案設定提供者

FileConfigurationProvider 是用於從檔案系統載入設定的基底類別。 以下是衍生自的設定提供者 FileConfigurationProvider

INI 設定提供者

IniConfigurationProvider 會在執行階段從 INI 檔案機碼值組載入設定。

下列程式碼會清除所有設定提供者,並新增數個設定提供者: [!code-csharp]

在上述程式碼中, MyIniConfig.iniMyIniConfig 中的設定 Environment 。中的設定會覆寫 ini 檔案:

範例下載包含下列 MyIniConfig.ini 檔案:

MyKey="MyIniConfig.ini Value"

[Position]
Title="My INI Config title"
Name="My INI Config name"

[Logging:LogLevel]
Default=Information
Microsoft=Warning

範例下載中的下列程式碼會顯示上述幾個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

JSON 設定提供者

JsonConfigurationProvider 從 JSON 檔案機碼值組載入設定。

多載可以指定:

  • 檔案是否為選擇性。
  • 檔案變更時是否要重新載入設定。

請考慮下列程式碼:

using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.AddJsonFile("MyConfig.json",
                       optional: true,
                       reloadOnChange: true);
});

builder.Services.AddRazorPages();

var app = builder.Build();

上述程式碼:

  • 設定 JSON 設定提供者,以使用下列選項載入 myconfig.xml 的 json 檔案:
    • optional: true:檔案是選擇性的。
    • reloadOnChange: true :儲存變更時,會重載該檔案。
  • 讀取 myconfig.xml json 檔案之前的 預設設定提供者。 設定預設設定提供者中的 myconfig.xml 檔案覆寫設定,包括 環境變數設定提供者命令列設定提供者

您通常 希望自訂 JSON 檔案覆寫 環境變數設定提供者命令列設定提供者中所設定的值。

XML 設定提供者

XmlConfigurationProvider 會在執行階段從 XML 檔案機碼值組載入設定。

下列程式碼會清除所有設定提供者,並新增數個設定提供者:

var builder = WebApplication.CreateBuilder(args);

builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.Sources.Clear();

    var env = hostingContext.HostingEnvironment;

    config.AddXmlFile("MyXMLFile.xml", optional: true, reloadOnChange: true)
          .AddXmlFile($"MyXMLFile.{env.EnvironmentName}.xml",
                         optional: true, reloadOnChange: true);

    config.AddEnvironmentVariables();

    if (args != null)
    {
        config.AddCommandLine(args);
    }
});

builder.Services.AddRazorPages();

var app = builder.Build();

在上述程式碼中, MyXMLFile.xmlMyXMLFile 中的設定 Environment 。中的設定會覆寫 xml 檔案:

範例下載包含下列 MyXMLFile.xml 檔案:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <MyKey>MyXMLFile Value</MyKey>
  <Position>
    <Title>Title from  MyXMLFile</Title>
    <Name>Name from MyXMLFile</Name>
  </Position>
  <Logging>
    <LogLevel>
      <Default>Information</Default>
      <Microsoft>Warning</Microsoft>
    </LogLevel>
  </Logging>
</configuration>

範例下載中的下列程式碼會顯示上述幾個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

name 屬性是用來區別元素,則可以重複那些使用相同元素名稱的元素:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <section name="section0">
    <key name="key0">value 00</key>
    <key name="key1">value 01</key>
  </section>
  <section name="section1">
    <key name="key0">value 10</key>
    <key name="key1">value 11</key>
  </section>
</configuration>

下列程式碼會讀取先前的設定檔,並顯示金鑰和值:

public class IndexModel : PageModel
{
    private readonly IConfiguration Configuration;

    public IndexModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var key00 = "section:section0:key:key0";
        var key01 = "section:section0:key:key1";
        var key10 = "section:section1:key:key0";
        var key11 = "section:section1:key:key1";

        var val00 = Configuration[key00];
        var val01 = Configuration[key01];
        var val10 = Configuration[key10];
        var val11 = Configuration[key11];

        return Content($"{key00} value: {val00} \n" +
                       $"{key01} value: {val01} \n" +
                       $"{key10} value: {val10} \n" +
                       $"{key10} value: {val11} \n"
                       );
    }
}

屬性可用來提供值:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <key attribute="value" />
  <section>
    <key attribute="value" />
  </section>
</configuration>

先前的設定檔會使用 value 載入下列機碼:

  • key:attribute
  • section:key:attribute

每個檔案的金鑰配置提供者

KeyPerFileConfigurationProvider 使用目錄的檔案做為設定機碼值組。 機碼是檔案名稱。 值包含檔案的內容。 每個檔案的每個檔案設定提供者都是在 Docker 裝載案例中使用。

若要啟用每個檔案機碼設定,請在 ConfigurationBuilder 的執行個體上呼叫 AddKeyPerFile 延伸模組方法。 檔案的 directoryPath 必須是絕對路徑。

多載允許指定:

  • 設定來源的 Action<KeyPerFileConfigurationSource> 委派。
  • 目錄是否為選擇性與目錄的路徑。

雙底線 (__) 是做為檔案名稱中的設定金鑰分隔符號使用。 例如,檔案名稱 Logging__LogLevel__System 會產生設定金鑰 Logging:LogLevel:System

建置主機時呼叫 ConfigureAppConfiguration 以指定應用程式的設定:

.ConfigureAppConfiguration((hostingContext, config) =>
{
    var path = Path.Combine(
        Directory.GetCurrentDirectory(), "path/to/files");
    config.AddKeyPerFile(directoryPath: path, optional: true);
})

記憶體設定提供者

MemoryConfigurationProvider 使用記憶體內集合做為設定機碼值組。

下列程式碼會將記憶體集合新增至設定系統:

var builder = WebApplication.CreateBuilder(args);

var Dict = new Dictionary<string, string>
        {
           {"MyKey", "Dictionary MyKey Value"},
           {"Position:Title", "Dictionary_Title"},
           {"Position:Name", "Dictionary_Name" },
           {"Logging:LogLevel:Default", "Warning"}
        };

builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.Sources.Clear();

    config.AddInMemoryCollection(Dict);

    config.AddEnvironmentVariables();

    if (args != null)
    {
        config.AddCommandLine(args);
    }
});

builder.Services.AddRazorPages();

var app = builder.Build();

範例下載中的下列程式碼會顯示上述設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

在上述程式碼中, config.AddInMemoryCollection(Dict) 是在 預設設定提供者之後加入。 如需排序設定提供者的範例,請參閱 JSON 設定提供者

請參閱使用 將陣列 系結到另一個範例 MemoryConfigurationProvider

Kestrel 端點設定

Kestrel 特定端點設定會覆寫所有 跨伺服器 端點設定。 跨伺服器端點設定包括:

請考慮 appsettings.json ASP.NET Core web 應用程式中使用的下列檔案:

{
  "Kestrel": {
    "Endpoints": {
      "Https": {
        "Url": "https://localhost:9999"
      }
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
} 

當先前反白顯示的標記用於 ASP.NET Core web 應用程式 ,並 在命令列上啟動應用程式時,會使用下列跨伺服器端點設定:

dotnet run --urls="https://localhost:7777"

Kestrel 系結至) 中為檔案 (設定的端點 Kestrel appsettings.json https://localhost:9999 ,而不是 https://localhost:7777

請考慮 Kestrel 設定為環境變數的特定端點:

set Kestrel__Endpoints__Https__Url=https://localhost:8888

在上述的環境變數中, Https 是 Kestrel 特定端點的名稱。 上述檔案 appsettings.json 也會定義 Kestrel 名為的特定端點 Https 。 依 預設,在 appsettings 之後,會讀取使用 環境變數設定提供者的環境變數 Environment因此 ,先前 的環境變數會用於 Https 端點。

GetValue

ConfigurationBinder.GetValue<T> 從具有指定索引鍵的設定中解壓縮單一值,並將其轉換為指定的類型:

public class TestNumModel : PageModel
{
    private readonly IConfiguration Configuration;

    public TestNumModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var number = Configuration.GetValue<int>("NumberKey", 99);
        return Content($"{number}");
    }
}

在上述程式碼中,如果在設定 NumberKey 中找不到, 99 就會使用的預設值。

GetSection、GetChildren 與 Exists

針對接下來的範例,請考慮下列 MySubsection 的 json 檔案:

{
  "section0": {
    "key0": "value00",
    "key1": "value01"
  },
  "section1": {
    "key0": "value10",
    "key1": "value11"
  },
  "section2": {
    "subsection0": {
      "key0": "value200",
      "key1": "value201"
    },
    "subsection1": {
      "key0": "value210",
      "key1": "value211"
    }
  }
}

下列程式碼會將 MySubsection 新增至設定提供者:

var builder = WebApplication.CreateBuilder(args);

builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.AddJsonFile("MySubsection.json",
                       optional: true,
                       reloadOnChange: true);
});

builder.Services.AddRazorPages();

var app = builder.Build();

GetSection

IConfiguration 會傳回具有指定之子區段索引鍵的設定子區段。

下列程式碼會傳回的值 section1

public class TestSectionModel : PageModel
{
    private readonly IConfiguration Config;

    public TestSectionModel(IConfiguration configuration)
    {
        Config = configuration.GetSection("section1");
    }

    public ContentResult OnGet()
    {
        return Content(
                $"section1:key0: '{Config["key0"]}'\n" +
                $"section1:key1: '{Config["key1"]}'");
    }
}

下列程式碼會傳回的值 section2:subsection0

public class TestSection2Model : PageModel
{
    private readonly IConfiguration Config;

    public TestSection2Model(IConfiguration configuration)
    {
        Config = configuration.GetSection("section2:subsection0");
    }

    public ContentResult OnGet()
    {
        return Content(
                $"section2:subsection0:key0 '{Config["key0"]}'\n" +
                $"section2:subsection0:key1:'{Config["key1"]}'");
    }
}

GetSection 絕不會傳回 null。 若找不到相符的區段,會傳回空的 IConfigurationSection

GetSection 傳回相符區段時,未填入 Value。 當區段存在時,會傳回 KeyPath

GetChildren 和 Exists

下列程式碼會呼叫 IConfiguration GetChildren ,並傳回 section2:subsection0 下列值:

public class TestSection4Model : PageModel
{
    private readonly IConfiguration Config;

    public TestSection4Model(IConfiguration configuration)
    {
        Config = configuration;
    }

    public ContentResult OnGet()
    {
        string s = "";
        var selection = Config.GetSection("section2");
        if (!selection.Exists())
        {
            throw new Exception("section2 does not exist.");
        }
        var children = selection.GetChildren();

        foreach (var subSection in children)
        {
            int i = 0;
            var key1 = subSection.Key + ":key" + i++.ToString();
            var key2 = subSection.Key + ":key" + i.ToString();
            s += key1 + " value: " + selection[key1] + "\n";
            s += key2 + " value: " + selection[key2] + "\n";
        }
        return Content(s);
    }
}

上述程式碼會呼叫 >microsoft.extensions.options.configurationextensions ,以確認區段存在:

系結陣列

ConfigurationBinder支援使用設定索引鍵中的陣列索引,將陣列系結至物件。 任何公開數位索引鍵區段的陣列格式都能夠將陣列系結至 POCO 類別陣列。

請考慮 範例下載中的 MyArray

{
  "array": {
    "entries": {
      "0": "value00",
      "1": "value10",
      "2": "value20",
      "4": "value40",
      "5": "value50"
    }
  }
}

下列程式碼會將 MyArray 新增至設定提供者:

var builder = WebApplication.CreateBuilder(args);

builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    config.AddJsonFile("MyArray.json",
                        optional: true,
                        reloadOnChange: true); ;
});

builder.Services.AddRazorPages();

var app = builder.Build();

下列程式碼會讀取設定,並顯示這些值:

public class ArrayModel : PageModel
{
    private readonly IConfiguration Config;
    public ArrayExample? _array { get; private set; }

    public ArrayModel(IConfiguration config)
    {
        Config = config;
    }

    public ContentResult OnGet()
    {
        if (_array == null)
        {
            throw new ArgumentNullException(nameof(_array));
        }

        _array = Config.GetSection("array").Get<ArrayExample>();
        string s = String.Empty;

        for (int j = 0; j < _array.Entries.Length; j++)
        {
            s += $"Index: {j}  Value:  {_array.Entries[j]} \n";
        }

        return Content(s);
    }
}

上述程式碼會傳回下列輸出:

Index: 0  Value: value00
Index: 1  Value: value10
Index: 2  Value: value20
Index: 3  Value: value40
Index: 4  Value: value50

在上述輸出中,索引3有值 value40 ,對應于 "4": "value40", MyArray 中。 系結陣列索引是連續的,不會系結至設定索引鍵索引。 設定系結器無法系結 null 值,或在系結物件中建立 null 專案。

自訂設定提供者

範例應用程式示範如何建立會使用 Entity Framework (EF) 從資料庫讀取設定機碼值組的基本設定提供者。

提供者具有下列特性:

  • EF 記憶體內資料庫會用於示範用途。 若要使用需要連接字串的資料庫,請實作第二個 ConfigurationBuilder 以從另一個設定提供者提供連接字串。
  • 啟動時,該提供者會將資料庫資料表讀入到設定中。 該提供者不會以個別機碼為基礎查詢資料庫。
  • 未實作變更時重新載入,因此在應用程式啟動後更新資料庫對應用程式設定沒有影響。

定義 EFConfigurationValue 實體來在資料庫中存放設定值。

Models/EFConfigurationValue.cs

public class EFConfigurationValue
{
    public string Id { get; set; } = String.Empty;
    public string Value { get; set; } = String.Empty;
}

新增 EFConfigurationContext 以存放及存取已設定的值。

EFConfigurationProvider/EFConfigurationContext.cs

public class EFConfigurationContext : DbContext
{
    public EFConfigurationContext(DbContextOptions<EFConfigurationContext> options) : base(options)
    {
    }

    public DbSet<EFConfigurationValue> Values => Set<EFConfigurationValue>();
}

建立會實作 IConfigurationSource 的類別。

EFConfigurationProvider/EFConfigurationSource.cs

public class EFConfigurationSource : IConfigurationSource
{
    private readonly Action<DbContextOptionsBuilder> _optionsAction;

    public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction) => _optionsAction = optionsAction;

    public IConfigurationProvider Build(IConfigurationBuilder builder) => new EFConfigurationProvider(_optionsAction);
}

透過繼承自 ConfigurationProvider 來建立自訂設定提供者。 若資料庫是空的,設定提供者會初始化資料庫。 由於設定索引鍵不區分大小寫,因此用來初始化資料庫的字典會以不區分大小寫的比較子來建立 (stringcomparison. OrdinalIgnoreCase) 。

EFConfigurationProvider/EFConfigurationProvider.cs

public class EFConfigurationProvider : ConfigurationProvider
{
    public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
    {
        OptionsAction = optionsAction;
    }

    Action<DbContextOptionsBuilder> OptionsAction { get; }

    public override void Load()
    {
        var builder = new DbContextOptionsBuilder<EFConfigurationContext>();

        OptionsAction(builder);

        using (var dbContext = new EFConfigurationContext(builder.Options))
        {
            if (dbContext == null || dbContext.Values == null)
            {
                throw new Exception("Null DB context");
            }
            dbContext.Database.EnsureCreated();

            Data = !dbContext.Values.Any()
                ? CreateAndSaveDefaultValues(dbContext)
                : dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
        }
    }

    private static IDictionary<string, string> CreateAndSaveDefaultValues(
        EFConfigurationContext dbContext)
    {
        // Quotes (c)2005 Universal Pictures: Serenity
        // https://www.uphe.com/movies/serenity
        var configValues =
            new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
            {
                    { "quote1", "I aim to misbehave." },
                    { "quote2", "I swallowed a bug." },
                    { "quote3", "You can't stop the signal, Mal." }
            };

        if (dbContext == null || dbContext.Values == null)
        {
            throw new Exception("Null DB context");
        }

        dbContext.Values.AddRange(configValues
            .Select(kvp => new EFConfigurationValue
            {
                Id = kvp.Key,
                Value = kvp.Value
            })
            .ToArray());

        dbContext.SaveChanges();

        return configValues;
    }
}

AddEFConfiguration 擴充方法允許新增設定來源到 ConfigurationBuilder

Extensions/EntityFrameworkExtensions.cs:

public static class EntityFrameworkExtensions
{
    public static IConfigurationBuilder AddEFConfiguration(
               this IConfigurationBuilder builder,
               Action<DbContextOptionsBuilder> optionsAction)
    {
        return builder.Add(new EFConfigurationSource(optionsAction));
    }
}

下列程式碼顯示如何在 Program.cs 中使用自訂 EFConfigurationProvider

//using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddEFConfiguration(
    opt => opt.UseInMemoryDatabase("InMemoryDb"));

var app = builder.Build();

app.Run();

存取頁面中的設定 Razor

下列程式碼會在頁面中顯示設定資料 Razor :

@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

Configuration value for 'MyKey': @Configuration["MyKey"]

在下列程式碼中, MyOptions 會新增至服務容器, Configure 並系結至設定:

using SampleApp.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.Configure<MyOptions>(
    builder.Configuration.GetSection("MyOptions"));

var app = builder.Build();

下列標記會使用指示詞 @inject Razor 來解析和顯示選項值:

@page
@model SampleApp.Pages.Test3Model
@using Microsoft.Extensions.Options
@using SampleApp.Models
@inject IOptions<MyOptions> optionsAccessor


<p><b>Option1:</b> @optionsAccessor.Value.Option1</p>
<p><b>Option2:</b> @optionsAccessor.Value.Option2</p>

MVC view 檔案中的存取設定

下列程式碼會顯示 MVC 視圖中的設定資料:

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

Configuration value for 'MyKey': @Configuration["MyKey"]

使用委派設定選項

在委派中設定的選項會覆寫設定提供者中所設定的值。

在下列程式碼中, IConfigureOptions<TOptions> 服務會新增至服務容器。 它會使用委派來設定下列值 MyOptions

using SampleApp.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.Configure<MyOptions>(myOptions =>
{
    myOptions.Option1 = "Value configured in delegate";
    myOptions.Option2 = 500;
});

var app = builder.Build();

下列程式碼會顯示選項值:

public class Test2Model : PageModel
{
    private readonly IOptions<MyOptions> _optionsDelegate;

    public Test2Model(IOptions<MyOptions> optionsDelegate )
    {
        _optionsDelegate = optionsDelegate;
    }

    public ContentResult OnGet()
    {
        return Content($"Option1: {_optionsDelegate.Value.Option1} \n" +
                       $"Option2: {_optionsDelegate.Value.Option2}");
    }
}

在上述範例中,和的值 Option1 Option2 是在中指定, appsettings.json 然後由設定的委派覆寫。

主機與應用程式組態的比較

設定及啟動應用程式之前,會先設定及啟動「主機」。 主機負責應用程式啟動和存留期管理。 應用程式與主機都是使用此主題中所述的設定提供者來設定的。 主機組態機碼/值組也會包含在應用程式的組態中。 如需有關當建置主機時如何使用設定提供者的詳細資訊,以及設定來源如何影響主機設定的詳細資訊,請參閱 ASP.NET Core 基本概念

預設主機設定

如需使用 Web 主機時預設組態的詳細資料,請參閱本主題的 ASP.NET Core 2.2 版本

  • 主機組態的提供來源:
  • 已建立 Web 主機預設組態 (ConfigureWebHostDefaults):
    • Kestrel 會當做 web 伺服器使用,並使用應用程式的設定提供者進行設定。
    • 新增主機篩選中介軟體。
    • 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 環境變數設定為 true,則會新增轉接的標頭中介軟體。
    • 啟用 IIS 整合。

其他設定

本主題僅適用于 應用程式 設定。 執行和主控 ASP.NET Core 應用程式的其他層面,是使用本主題未涵蓋的設定檔來設定:

launchsettings.json 中設定的環境變數會覆寫系統內容中所設定的環境變數。

如需從舊版 ASP.NET 遷移應用程式設定的詳細資訊,請參閱 從 ASP.NET 移轉至 ASP.NET Core

從外部組件新增設定

IHostingStartup 實作允許在啟動時從應用程式 Startup 類別外部的外部組件,針對應用程式新增增強功能。 如需詳細資訊,請參閱在 ASP.NET Core 中使用裝載啟動組件

其他資源

ASP.NET Core 中的設定是使用一或多個設定提供者來執行。 設定提供者會使用各種設定來源從機碼值組讀取設定資料:

  • 設定檔案,例如 appsettings.json
  • 環境變數
  • Azure 金鑰保存庫
  • Azure 應用程式組態
  • 命令列引數
  • 自訂提供者、已安裝或已建立
  • 目錄檔案
  • 記憶體內部 .NET 物件

本主題提供 ASP.NET Core 中設定的相關資訊。 如需在主控台應用程式中使用設定的詳細資訊,請參閱 .net設定。

查看或下載範例程式碼 (如何下載)

預設組態

ASP.NET Core 使用dotnet new或 Visual Studio 建立的 web 應用程式會產生下列程式碼:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

CreateDefaultBuilder 會以下列順序提供應用程式的預設組態:

  1. ChainedConfigurationProvider :加入現有的 IConfiguration 作為來源。 在預設設定案例中,新增 主機 設定,並將其設定為 應用程式 設定的第一個來源。
  2. appsettings.json 使用 JSON 設定提供者
  3. appsettings。 Environment使用 json 設定提供者json。 例如, appsettings生產 * * _._jsonappsettings。 * * * 開發 _._json *。
  4. 應用程式在環境中執行時的應用程式秘密 Development
  5. 使用 環境變數設定提供者的環境變數。
  6. 使用 命令列設定提供者的命令列引數。

稍後新增的設定提供者會覆寫先前的金鑰設定。 例如,如果 MyKey 在和環境中設定 appsettings.json ,則會使用環境值。 使用預設的設定提供者, 命令列設定提供者 會覆寫所有其他提供者。

如需的詳細資訊 CreateDefaultBuilder ,請參閱 預設 builder 設定

下列程式碼會依新增的順序顯示已啟用的設定提供者:

public class Index2Model : PageModel
{
    private IConfigurationRoot ConfigRoot;

    public Index2Model(IConfiguration configRoot)
    {
        ConfigRoot = (IConfigurationRoot)configRoot;
    }

    public ContentResult OnGet()
    {           
        string str = "";
        foreach (var provider in ConfigRoot.Providers.ToList())
        {
            str += provider.ToString() + "\n";
        }

        return Content(str);
    }
}

appsettings.json

請考慮下列檔案 appsettings.json

{
    "Position": {
        "Title": "編輯器",
        "Name": "Joe Smith"
    },
    "MyKey": "My appsettings.json Value",
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

範例下載中的下列程式碼會顯示上述幾個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

預設會 JsonConfigurationProvider 以下列順序載入設定:

  1. appsettings.json
  2. appsettings。 Environment. json :例如 appsettings生產 * * _._jsonappsettings* * * 開發 _._json * 檔案。 檔案的環境版本是根據 IHostingEnvironment EnvironmentName載入。 如需詳細資訊,請參閱在 ASP.NET Core 中使用多個環境

appsettings... Environmentjson 值會覆寫中的索引鍵 appsettings.json 。 例如,根據預設:

  • 在開發期間, appsettings. *開發 _._json * 設定會覆寫在中找到的值 appsettings.json
  • 在生產環境中, appsettings. *生產 _._json * 設定會覆寫在中找到的值 appsettings.json 。 例如,將應用程式部署至 Azure 時。

如果必須保證設定值,請參閱 GetValue。 上述範例只會讀取字串,且不支援預設值。

使用 預設設定, appsettings.json 以及 appsettings。 Environment已啟用 reloadOnChange: truejson 檔案。 對和 appsettings 進行的變更 appsettings.json Environmentjson 設定 提供者會讀取應用程式啟動 json 檔案。

使用選項模式系結階層式設定資料

讀取相關設定值的慣用方式是使用 選項模式。 例如,若要讀取下列設定值:

  "Position": {
    "Title": "Editor",
    "Name": "Joe Smith"
  }

建立下列 PositionOptions 類別:

public class PositionOptions
{
    public const string Position = "Position";

    public string Title { get; set; }
    public string Name { get; set; }
}

Options 類別:

  • 必須是具有公用無參數的函式的非抽象。
  • 型別的所有公用讀寫屬性都會系結。
  • 欄位 系結。 在上述程式碼中,未系結 Position 。 使用屬性,因此在將類別系結 Position "Position" 至設定提供者時,不需要在應用程式中硬式編碼字串。

下列程式碼:

  • 呼叫 ConfigurationBinder ,將類別系結至 PositionOptions Position 區段。
  • 顯示 Position 設置資料。
public class Test22Model : PageModel
{
    private readonly IConfiguration Configuration;

    public Test22Model(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var positionOptions = new PositionOptions();
        Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);

        return Content($"Title: {positionOptions.Title} \n" +
                       $"Name: {positionOptions.Name}");
    }
}

在上述程式碼中,預設會讀取應用程式啟動後的 JSON 設定檔變更。

ConfigurationBinder.Get<T> 系結並傳回指定的型別。 ConfigurationBinder.Get<T> 可能比使用更方便 ConfigurationBinder.Bind 。 下列程式碼顯示如何搭配 ConfigurationBinder.Get<T> PositionOptions 類別使用:

public class Test21Model : PageModel
{
    private readonly IConfiguration Configuration;
    public PositionOptions positionOptions { get; private set; }

    public Test21Model(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {            
        positionOptions = Configuration.GetSection(PositionOptions.Position)
                                                     .Get<PositionOptions>();

        return Content($"Title: {positionOptions.Title} \n" +
                       $"Name: {positionOptions.Name}");
    }
}

在上述程式碼中,預設會讀取應用程式啟動後的 JSON 設定檔變更。

使用 *選項模式 _ 的替代方法是系結 Position 區段,並將它加入至相依性 插入服務容器。 在下列程式碼中, PositionOptions 會新增至服務容器, <xref:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure_> 並系結至設定:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<PositionOptions>(Configuration.GetSection(
                                        PositionOptions.Position));
    services.AddRazorPages();
}

使用上述程式碼,下列程式碼會讀取位置選項:

public class Test2Model : PageModel
{
    private readonly PositionOptions _options;

    public Test2Model(IOptions<PositionOptions> options)
    {
        _options = options.Value;
    }

    public ContentResult OnGet()
    {
        return Content($"Title: {_options.Title} \n" +
                       $"Name: {_options.Name}");
    }
}

在上述程式碼中, 會讀取應用程式啟動後的 JSON 設定檔變更。 若要讀取應用程式啟動後的變更,請使用 IOptionsSnapshot

使用 預設設定, appsettings.json 以及 appsettings。 Environment已啟用 reloadOnChange: truejson 檔案。 對和 appsettings 進行的變更 appsettings.json Environmentjson 設定 提供者會讀取應用程式啟動 json 檔案。

如需新增其他 JSON 設定檔的相關資訊,請參閱本檔中的 json 設定提供者

合併服務集合

請考慮下列 ConfigureServices 方法,它會註冊服務並設定選項:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<PositionOptions>(
        Configuration.GetSection(PositionOptions.Position));
    services.Configure<ColorOptions>(
        Configuration.GetSection(ColorOptions.Color));

    services.AddScoped<IMyDependency, MyDependency>();
    services.AddScoped<IMyDependency2, MyDependency2>();

    services.AddRazorPages();
}

您可以將相關的註冊群組移至擴充方法,以註冊服務。 例如,設定服務會新增至下列類別:

using ConfigSample.Options;
using Microsoft.Extensions.Configuration;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class MyConfigServiceCollectionExtensions
    {
        public static IServiceCollection AddConfig(
             this IServiceCollection services, IConfiguration config)
        {
            services.Configure<PositionOptions>(
                config.GetSection(PositionOptions.Position));
            services.Configure<ColorOptions>(
                config.GetSection(ColorOptions.Color));

            return services;
        }
    }
}

其餘的服務會註冊在類似的類別中。 下列 ConfigureServices 方法會使用新的擴充方法來註冊服務:

public void ConfigureServices(IServiceCollection services)
{
    services.AddConfig(Configuration)
            .AddMyDependencyGroup();

    services.AddRazorPages();
}

注意: 每個 services.Add{GROUP_NAME} 擴充方法會新增並可能設定服務。 例如, AddControllersWithViews 新增具有 views 需求的服務 MVC 控制器,並 AddRazorPages 新增服務頁面所 Razor 需的服務。 建議應用程式遵循在命名空間中建立擴充方法的命名慣例 Microsoft.Extensions.DependencyInjection 。 在命名空間中建立擴充方法 Microsoft.Extensions.DependencyInjection

  • 封裝服務註冊的群組。
  • 提供對服務的方便 IntelliSense 存取。

安全性與使用者秘密

設定資料指導方針:

  • 永遠不要將密碼或其他敏感性資料儲存在設定提供者程式碼或純文字設定檔中。 秘密管理員工具可以用來在開發中儲存秘密。
  • 不要在開發或測試環境中使用生產環境祕密。
  • 請在專案外部指定祕密,以防止其意外認可至開放原始碼存放庫。

根據 預設,使用者秘密設定來源會在 JSON 設定來源之後註冊。 因此,使用者秘密金鑰優先于和 appsettings 中的金鑰 appsettings.json Environment. json

如需有關儲存密碼或其他敏感性資料的詳細資訊:

Azure Key Vault 可安全地儲存 ASP.NET Core 應用程式的應用程式祕密。 如需詳細資訊,請參閱ASP.NET Core 中的 Azure Key Vault 設定提供者

環境變數

使用 預設設定時,會在 EnvironmentVariablesConfigurationProvider 讀取之後從環境變數機碼值組載入設定 appsettings.jsonappsettings)。 Environment. json使用者秘密。 因此,從環境讀取的索引鍵值會覆寫 appsettings 中讀取的值 appsettings.json Environment. json 和使用者秘密。

:分隔符號不適用於所有平臺上的環境變數階層式索引鍵。 __(雙底線)為:

  • 所有平臺都支援。 例如, : Bash不支援分隔符號,但 __ 為。
  • 自動取代為 :

下列 set 命令:

  • 在 Windows 上設定上述範例的環境索引鍵和值。
  • 使用 範例下載時,測試設定。 dotnet run命令必須在專案目錄中執行。
set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run

先前的環境設定:

  • 只會在從其設定的命令視窗啟動的進程中設定。
  • 使用 Visual Studio 啟動的瀏覽器將無法讀取。

您可以使用下列的setx命令,在 Windows 設定環境機碼和值。 與不同 setsetx 是,設定會持續保存。 /M 設定系統內容中的變數。 如果 /M 未使用此參數,則會設定使用者環境變數。

setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M

若要測試上述命令是否覆寫 appsettings.jsonappsettings。 Environment. json

  • 使用 Visual Studio: Exit 並重新啟動 Visual Studio。
  • 使用 CLI:啟動新的命令視窗,然後輸入 dotnet run

AddEnvironmentVariables使用字串呼叫以指定環境變數的前置詞:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

在上述程式碼中:

  • config.AddEnvironmentVariables(prefix: "MyCustomPrefix_") 會在預設設定 提供者之後加入。 如需排序設定提供者的範例,請參閱 JSON 設定提供者
  • 具有前置詞的環境變數會覆 MyCustomPrefix_ 寫預設的設定 提供者。 這包括沒有前置詞的環境變數。

讀取設定機碼值組時,會移除前置詞。

下列命令會測試自訂前置詞:

set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
set MyCustomPrefix_Position__Title=Editor_with_customPrefix
set MyCustomPrefix_Position__Name=Environment_Rick_cp
dotnet run

預設設定會載入前面加上和的環境變數和命令列引數 DOTNET_ ASPNETCORE_ 。 和前置詞 DOTNET_ ASPNETCORE_ 是由 ASP.NET Core 用於主機和應用程式設定,但不適用於使用者設定。 如需有關主機和應用程式設定的詳細資訊,請參閱 .Net 泛型主機

Azure App Service上,選取 [設定 > 設定] 頁面上的 [新增應用程式設定]。 Azure App Service 的應用程式設定如下:

  • 靜態加密,並透過加密通道傳輸。
  • 公開為環境變數。

如需詳細資訊,請參閱 Azure App:使用 Azure 入口網站覆寫應用程式設定

如需 Azure 資料庫連接字串的相關資訊,請參閱 連接字串 前置詞。

環境變數的命名

環境變數名稱會反映檔案的結構 appsettings.json 。 階層中的每個元素會以雙底線分隔 (偏好) 或冒號。 當元素結構包含陣列時,應該將陣列索引視為這個路徑中的其他元素名稱。 請考慮下列檔案 appsettings.json 及其對等的值(以環境變數表示)。

appsettings.json

{
    "SmtpServer": "smtp.example.com",
    "Logging": [
        {
            "Name": "ToEmail",
            "Level": "Critical",
            "Args": {
                "FromAddress": "MySystem@example.com",
                "ToAddress": "SRE@example.com"
            }
        },
        {
            "Name": "ToConsole",
            "Level": "Information"
        }
    ]
}

環境變數

setx SmtpServer=smtp.example.com
setx Logging__0__Name=ToEmail
setx Logging__0__Level=Critical
setx Logging__0__Args__FromAddress=MySystem@example.com
setx Logging__0__Args__ToAddress=SRE@example.com
setx Logging__1__Name=ToConsole
setx Logging__1__Level=Information

在產生的 Launchsettings.json 中設定的環境變數

launchsettings.json 中設定的環境變數會覆寫系統內容中所設定的環境變數。 例如,ASP.NET Core web 範本會產生 launchsettings.json 檔案,將端點設定設定為:

"applicationUrl": "https://localhost:5001;http://localhost:5000"

設定會 applicationUrl 設定 ASPNETCORE_URLS 環境變數,並覆寫環境中設定的值。

在 Linux 上的 Escape 環境變數

在 Linux 上,必須將 URL 環境變數的值換成 systemd 可加以剖析。 使用產生的 linux 工具 systemd-escape``http:--localhost:5001

groot@terminus:~$ systemd-escape http://localhost:5001
http:--localhost:5001

顯示環境變數

下列程式碼會顯示應用程式啟動時的環境變數和值,這在進行環境設定的偵錯工具時很有用:

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    var config = host.Services.GetRequiredService<IConfiguration>();

    foreach (var c in config.AsEnumerable())
    {
        Console.WriteLine(c.Key + " = " + c.Value);
    }
    host.Run();
}

命令列

使用 預設 設定時,會 CommandLineConfigurationProvider 從命令列引數索引鍵/值組在下列設定來源之後載入設定:

  • appsettings.jsonappsettingsEnvironmentjson 檔案。
  • 開發環境中的應用程式秘密
  • 環境變數。

根據 預設,在命令列覆寫設定值設定的設定值會與所有其他設定提供者一起設定。

命令列引數

下列命令會使用下列命令來設定索引鍵和值 =

dotnet run MyKey="My key from command line" Position:Title=Cmd Position:Name=Cmd_Rick

下列命令會使用下列命令來設定索引鍵和值 /

dotnet run /MyKey "Using /" /Position:Title=Cmd_ /Position:Name=Cmd_Rick

下列命令會使用下列命令來設定索引鍵和值 --

dotnet run --MyKey "Using --" --Position:Title=Cmd-- --Position:Name=Cmd--Rick

索引鍵值:

  • 必須遵循 = ,或者 -- / 當值在空格後面時,索引鍵必須有或的前置詞。
  • 如果 = 使用,則不需要。 例如: MySetting=

在相同的命令中,不要混用 = 與使用空格的索引鍵/值組搭配使用的命令列引數索引鍵/值配對。

切換對應

交換器對應允許索引 名稱取代邏輯。 為方法提供切換取代的字典 AddCommandLine

使用切換對應字典時,會檢查字典中是否有任何索引鍵符合命令列引數所提供的索引鍵。 如果在字典中找到命令列索引鍵,則會傳回字典值以將索引鍵/值組設定為應用程式的設定。 所有前面加上單虛線 (-) 的命令列索引鍵都需要切換對應。

切換對應字典索引鍵規則:

  • 參數的開頭必須是 ---
  • 切換對應字典不能包含重複索引鍵。

若要使用切換對應字典,請將它傳遞到的呼叫中 AddCommandLine

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var switchMappings = new Dictionary<string, string>()
         {
             { "-k1", "key1" },
             { "-k2", "key2" },
             { "--alt3", "key3" },
             { "--alt4", "key4" },
             { "--alt5", "key5" },
             { "--alt6", "key6" },
         };

        return Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddCommandLine(args, switchMappings);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    }
}

下列程式碼顯示已取代金鑰的索引鍵值:

public class Test3Model : PageModel
{
    private readonly IConfiguration Config;

    public Test3Model(IConfiguration configuration)
    {
        Config = configuration;
    }

    public ContentResult OnGet()
    {
        return Content(
                $"Key1: '{Config["Key1"]}'\n" +
                $"Key2: '{Config["Key2"]}'\n" +
                $"Key3: '{Config["Key3"]}'\n" +
                $"Key4: '{Config["Key4"]}'\n" +
                $"Key5: '{Config["Key5"]}'\n" +
                $"Key6: '{Config["Key6"]}'");
    }
}

下列命令適用于測試金鑰取代:

dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6

針對使用切換對應的應用程式,呼叫 CreateDefaultBuilder 不應傳遞引數。 CreateDefaultBuilder方法的 AddCommandLine 呼叫不包含對應的參數,而且沒有任何方法可將切換對應字典傳遞給 CreateDefaultBuilder 。 解決方案不會將引數傳遞至, CreateDefaultBuilder 而是會允許 ConfigurationBuilder 方法的 AddCommandLine 方法處理引數和切換對應字典。

使用 Visual Studio 設定環境和命令列引數

下圖顯示使用 Visual Studio 設定環境和命令列引數:

VS 的 [偵錯工具] 索引標籤

在 Visual Studio 2019 16.10 preview 4 和更新版本中,設定環境和命令列引數是從啟動設定檔 UI 中完成:

啟動設定檔 UI

階層式設定資料

設定 API 會透過使用設定金鑰中的分隔符號來簡維階層式資料,以讀取階層式設定資料。

範例下載包含下列檔案 appsettings.json

{
    "Position": {
        "Title": "編輯器",
        "Name": "Joe Smith"
    },
    "MyKey": "My appsettings.json Value",
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

範例下載中的下列程式碼會顯示數個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

讀取階層式設定資料的慣用方式是使用選項模式。 如需詳細資訊,請參閱本檔中的系結階層式設定 資料

GetSectionGetChildren 方法可用來在設定資料中隔離區段與區段的子系。 GetSection,、 GetChildren 與 Exists 中說明這些方法。

設定機碼和值

設定金鑰:

  • 不區分大小寫。 例如,ConnectionStringconnectionstring 會被視為相等的機碼。
  • 如果在多個設定提供者中設定索引鍵和值,則會使用最後新增的提供者所提供的值。 如需詳細資訊,請參閱 預設設定。
  • 階層式機碼
    • 在設定 API 內,冒號分隔字元 (:) 可在所有平台上運作。
    • 在環境變數中,冒號分隔字元可能無法在所有平台上運作。 所有平臺都支援雙底線、 __ ,而且會自動轉換為冒號 :
    • 在 Azure Key Vault 中,階層式索引鍵會使用 -- 做為分隔符號。 -- : 當秘密載入至應用程式的設定時,Azure Key Vault 設定提供者會自動取代為。
  • ConfigurationBinder 支援在設定機碼中使用陣列索引將陣列繫結到物件。 將陣列繫結到類別一節說明陣列繫結。

設定值:

  • 為字串。
  • Null 值無法存放在設定中或繫結到物件。

設定提供者

下表顯示可供 ASP.NET Core 應用程式使用的設定提供者。

提供者 從提供設定
Azure Key Vault 設定提供者 Azure 金鑰保存庫
Azure App 設定提供者 Azure 應用程式組態
命令列設定提供者 命令列參數
自訂設定提供者 自訂來源
環境變數設定提供者 環境變數
檔案設定提供者 INI、JSON 和 XML 檔案
每個檔案的金鑰配置提供者 目錄檔案
記憶體設定提供者 記憶體內集合
使用者祕密 使用者設定檔目錄中的檔案

設定來源會依照其設定提供者的指定順序讀取。 在程式碼中訂購設定提供者,以符合應用程式所需之基礎設定來源的優先順序。

典型的設定提供者順序是:

  1. appsettings.json
  2. appsettings... Environmentjson
  3. 使用者祕密
  4. 使用 環境變數設定提供者的環境變數。
  5. 使用 命令列設定提供者的命令列引數。

常見的作法是將命令列設定提供者新增至一系列的提供者,以允許命令列引數覆寫其他提供者所設定的設定。

先前的提供者序列會用於 預設設定中。

連接字串前置詞

設定 API 有四個連接字串環境變數的特殊處理規則。 這些連接字串涉及設定應用程式環境的 Azure 連接字串。 具有資料表中所顯示前置詞的環境變數會以 預設 設定載入至應用程式,或不提供任何前置詞 AddEnvironmentVariables

連接字串前置詞 提供者
CUSTOMCONNSTR_ 自訂提供者
MYSQLCONNSTR_ MySQL
SQLAZURECONNSTR_ Azure SQL Database
SQLCONNSTR_ SQL Server

當探索到具有下表所顯示之任何四個前置詞的環境變數並將其載入到設定中時:

  • 會透過移除環境變數前置詞並新增設定機碼區段 (ConnectionStrings) 來移除具有下表顯示之前置詞的環境變數。
  • 會建立新的設定機碼值組以代表資料庫連線提供者 (CUSTOMCONNSTR_ 除外,這沒有所述提供者)。
環境變數機碼 已轉換的設定機碼 提供者設定項目
CUSTOMCONNSTR_{KEY} ConnectionStrings:{KEY} 設定項目未建立。
MYSQLCONNSTR_{KEY} ConnectionStrings:{KEY} 機碼:ConnectionStrings:{KEY}_ProviderName
值:MySql.Data.MySqlClient
SQLAZURECONNSTR_{KEY} ConnectionStrings:{KEY} 機碼:ConnectionStrings:{KEY}_ProviderName
值:System.Data.SqlClient
SQLCONNSTR_{KEY} ConnectionStrings:{KEY} 機碼:ConnectionStrings:{KEY}_ProviderName
值:System.Data.SqlClient

檔案設定提供者

FileConfigurationProvider 是用於從檔案系統載入設定的基底類別。 以下是衍生自的設定提供者 FileConfigurationProvider

INI 設定提供者

IniConfigurationProvider 會在執行階段從 INI 檔案機碼值組載入設定。

下列程式碼會清除所有設定提供者,並新增數個設定提供者:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.Sources.Clear();

                var env = hostingContext.HostingEnvironment;

                config.AddIniFile("MyIniConfig.ini", optional: true, reloadOnChange: true)
                      .AddIniFile($"MyIniConfig.{env.EnvironmentName}.ini",
                                     optional: true, reloadOnChange: true);

                config.AddEnvironmentVariables();

                if (args != null)
                {
                    config.AddCommandLine(args);
                }
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

在上述程式碼中, MyIniConfig.iniMyIniConfig 中的設定 Environment 。中的設定會覆寫 ini 檔案:

範例下載包含下列 MyIniConfig.ini 檔案:

MyKey="MyIniConfig.ini Value"

[Position]
Title="My INI Config title"
Name="My INI Config name"

[Logging:LogLevel]
Default=Information
Microsoft=Warning

範例下載中的下列程式碼會顯示上述幾個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

JSON 設定提供者

JsonConfigurationProvider 從 JSON 檔案機碼值組載入設定。

多載可以指定:

  • 檔案是否為選擇性。
  • 檔案變更時是否要重新載入設定。

請考慮下列程式碼:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("MyConfig.json", 
                    optional: true, 
                    reloadOnChange: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

上述程式碼:

  • 設定 JSON 設定提供者,以使用下列選項載入 myconfig.xml 的 json 檔案:
    • optional: true:檔案是選擇性的。
    • reloadOnChange: true :儲存變更時,會重載該檔案。
  • 讀取 myconfig.xml json 檔案之前的 預設設定提供者。 設定預設設定提供者中的 myconfig.xml 檔案覆寫設定,包括 環境變數設定提供者命令列設定提供者

您通常 希望自訂 JSON 檔案覆寫 環境變數設定提供者命令列設定提供者中所設定的值。

下列程式碼會清除所有設定提供者,並新增數個設定提供者:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.Sources.Clear();

                var env = hostingContext.HostingEnvironment;

                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 
                                     optional: true, reloadOnChange: true);

                config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true)
                      .AddJsonFile($"MyConfig.{env.EnvironmentName}.json",
                                     optional: true, reloadOnChange: true);

                config.AddEnvironmentVariables();

                if (args != null)
                {
                    config.AddCommandLine(args);
                }
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

在上述程式碼中, myconfig.xmlmyconfig.xml 中的 Environment 設定。json 檔案:

範例下載包含下列 myconfig.xml 檔案:

{
    "Position": {
        "Title": "我的設定標題",
        "Name": "My Config Smith"
    },
    "MyKey": "MyConfig.json Value",
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

範例下載中的下列程式碼會顯示上述幾個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

XML 設定提供者

XmlConfigurationProvider 會在執行階段從 XML 檔案機碼值組載入設定。

下列程式碼會清除所有設定提供者,並新增數個設定提供者:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.Sources.Clear();

                var env = hostingContext.HostingEnvironment;

                config.AddXmlFile("MyXMLFile.xml", optional: true, reloadOnChange: true)
                      .AddXmlFile($"MyXMLFile.{env.EnvironmentName}.xml",
                                     optional: true, reloadOnChange: true);

                config.AddEnvironmentVariables();

                if (args != null)
                {
                    config.AddCommandLine(args);
                }
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

在上述程式碼中, MyXMLFile.xmlMyXMLFile 中的設定 Environment 。中的設定會覆寫 xml 檔案:

範例下載包含下列 MyXMLFile.xml 檔案:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <MyKey>MyXMLFile Value</MyKey>
  <Position>
    <Title>Title from  MyXMLFile</Title>
    <Name>Name from MyXMLFile</Name>
  </Position>
  <Logging>
    <LogLevel>
      <Default>Information</Default>
      <Microsoft>Warning</Microsoft>
    </LogLevel>
  </Logging>
</configuration>

範例下載中的下列程式碼會顯示上述幾個設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

name 屬性是用來區別元素,則可以重複那些使用相同元素名稱的元素:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <section name="section0">
    <key name="key0">value 00</key>
    <key name="key1">value 01</key>
  </section>
  <section name="section1">
    <key name="key0">value 10</key>
    <key name="key1">value 11</key>
  </section>
</configuration>

下列程式碼會讀取先前的設定檔,並顯示金鑰和值:

public class IndexModel : PageModel
{
    private readonly IConfiguration Configuration;

    public IndexModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var key00 = "section:section0:key:key0";
        var key01 = "section:section0:key:key1";
        var key10 = "section:section1:key:key0";
        var key11 = "section:section1:key:key1";

        var val00 = Configuration[key00];
        var val01 = Configuration[key01];
        var val10 = Configuration[key10];
        var val11 = Configuration[key11];

        return Content($"{key00} value: {val00} \n" +
                       $"{key01} value: {val01} \n" +
                       $"{key10} value: {val10} \n" +
                       $"{key10} value: {val11} \n"
                       );
    }
}

屬性可用來提供值:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <key attribute="value" />
  <section>
    <key attribute="value" />
  </section>
</configuration>

先前的設定檔會使用 value 載入下列機碼:

  • key:attribute
  • section:key:attribute

每個檔案的金鑰配置提供者

KeyPerFileConfigurationProvider 使用目錄的檔案做為設定機碼值組。 機碼是檔案名稱。 值包含檔案的內容。 每個檔案的每個檔案設定提供者都是在 Docker 裝載案例中使用。

若要啟用每個檔案機碼設定,請在 ConfigurationBuilder 的執行個體上呼叫 AddKeyPerFile 延伸模組方法。 檔案的 directoryPath 必須是絕對路徑。

多載允許指定:

  • 設定來源的 Action<KeyPerFileConfigurationSource> 委派。
  • 目錄是否為選擇性與目錄的路徑。

雙底線 (__) 是做為檔案名稱中的設定金鑰分隔符號使用。 例如,檔案名稱 Logging__LogLevel__System 會產生設定金鑰 Logging:LogLevel:System

建置主機時呼叫 ConfigureAppConfiguration 以指定應用程式的設定:

.ConfigureAppConfiguration((hostingContext, config) =>
{
    var path = Path.Combine(
        Directory.GetCurrentDirectory(), "path/to/files");
    config.AddKeyPerFile(directoryPath: path, optional: true);
})

記憶體設定提供者

MemoryConfigurationProvider 使用記憶體內集合做為設定機碼值組。

下列程式碼會將記憶體集合新增至設定系統:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var Dict = new Dictionary<string, string>
        {
           {"MyKey", "Dictionary MyKey Value"},
           {"Position:Title", "Dictionary_Title"},
           {"Position:Name", "Dictionary_Name" },
           {"Logging:LogLevel:Default", "Warning"}
        };

        return Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddInMemoryCollection(Dict);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    }
}

範例下載中的下列程式碼會顯示上述設定設定:

public class TestModel : PageModel
{
    // requires using Microsoft.Extensions.Configuration;
    private readonly IConfiguration Configuration;

    public TestModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var myKeyValue = Configuration["MyKey"];
        var title = Configuration["Position:Title"];
        var name = Configuration["Position:Name"];
        var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


        return Content($"MyKey value: {myKeyValue} \n" +
                       $"Title: {title} \n" +
                       $"Name: {name} \n" +
                       $"Default Log Level: {defaultLogLevel}");
    }
}

在上述程式碼中, config.AddInMemoryCollection(Dict) 是在 預設設定提供者之後加入。 如需排序設定提供者的範例,請參閱 JSON 設定提供者

請參閱使用 將陣列 系結到另一個範例 MemoryConfigurationProvider

Kestrel 端點設定

Kestrel 特定端點設定會覆寫所有 跨伺服器 端點設定。 跨伺服器端點設定包括:

請考慮 appsettings.json ASP.NET Core web 應用程式中使用的下列檔案:

{
  "Kestrel": {
    "Endpoints": {
      "Https": {
        "Url": "https://localhost:9999"
      }
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
} 

當先前反白顯示的標記用於 ASP.NET Core web 應用程式 ,並 在命令列上啟動應用程式時,會使用下列跨伺服器端點設定:

dotnet run --urls="https://localhost:7777"

Kestrel 系結至) 中為檔案 (設定的端點 Kestrel appsettings.json https://localhost:9999 ,而不是 https://localhost:7777

請考慮 Kestrel 設定為環境變數的特定端點:

set Kestrel__Endpoints__Https__Url=https://localhost:8888

在上述的環境變數中, Https 是 Kestrel 特定端點的名稱。 上述檔案 appsettings.json 也會定義 Kestrel 名為的特定端點 Https 。 依 預設,在 appsettings 之後,會讀取使用 環境變數設定提供者的環境變數 Environment因此 ,先前 的環境變數會用於 Https 端點。

GetValue

ConfigurationBinder.GetValue<T> 從具有指定索引鍵的設定中解壓縮單一值,並將其轉換為指定的類型:

public class TestNumModel : PageModel
{
    private readonly IConfiguration Configuration;

    public TestNumModel(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public ContentResult OnGet()
    {
        var number = Configuration.GetValue<int>("NumberKey", 99);
        return Content($"{number}");
    }
}

在上述程式碼中,如果在設定 NumberKey 中找不到, 99 就會使用的預設值。

GetSection、GetChildren 與 Exists

針對接下來的範例,請考慮下列 MySubsection 的 json 檔案:

{
  "section0": {
    "key0": "value00",
    "key1": "value01"
  },
  "section1": {
    "key0": "value10",
    "key1": "value11"
  },
  "section2": {
    "subsection0": {
      "key0": "value200",
      "key1": "value201"
    },
    "subsection1": {
      "key0": "value210",
      "key1": "value211"
    }
  }
}

下列程式碼會將 MySubsection 新增至設定提供者:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("MySubsection.json", 
                    optional: true, 
                    reloadOnChange: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

GetSection

IConfiguration 會傳回具有指定之子區段索引鍵的設定子區段。

下列程式碼會傳回的值 section1

public class TestSectionModel : PageModel
{
    private readonly IConfiguration Config;

    public TestSectionModel(IConfiguration configuration)
    {
        Config = configuration.GetSection("section1");
    }

    public ContentResult OnGet()
    {
        return Content(
                $"section1:key0: '{Config["key0"]}'\n" +
                $"section1:key1: '{Config["key1"]}'");
    }
}

下列程式碼會傳回的值 section2:subsection0

public class TestSection2Model : PageModel
{
    private readonly IConfiguration Config;

    public TestSection2Model(IConfiguration configuration)
    {
        Config = configuration.GetSection("section2:subsection0");
    }

    public ContentResult OnGet()
    {
        return Content(
                $"section2:subsection0:key0 '{Config["key0"]}'\n" +
                $"section2:subsection0:key1:'{Config["key1"]}'");
    }
}

GetSection 絕不會傳回 null。 若找不到相符的區段,會傳回空的 IConfigurationSection

GetSection 傳回相符區段時,未填入 Value。 當區段存在時,會傳回 KeyPath

GetChildren 和 Exists

下列程式碼會呼叫 IConfiguration GetChildren ,並傳回 section2:subsection0 下列值:

public class TestSection4Model : PageModel
{
    private readonly IConfiguration Config;

    public TestSection4Model(IConfiguration configuration)
    {
        Config = configuration;
    }

    public ContentResult OnGet()
    {
        string s = null;
        var selection = Config.GetSection("section2");
        if (!selection.Exists())
        {
            throw new System.Exception("section2 does not exist.");
        }
        var children = selection.GetChildren();

        foreach (var subSection in children)
        {
            int i = 0;
            var key1 = subSection.Key + ":key" + i++.ToString();
            var key2 = subSection.Key + ":key" + i.ToString();
            s += key1 + " value: " + selection[key1] + "\n";
            s += key2 + " value: " + selection[key2] + "\n";
        }
        return Content(s);
    }
}

上述程式碼會呼叫 >microsoft.extensions.options.configurationextensions ,以確認區段存在:

系結陣列

ConfigurationBinder支援使用設定索引鍵中的陣列索引,將陣列系結至物件。 任何公開數位索引鍵區段的陣列格式都能夠將陣列系結至 POCO 類別陣列。

請考慮 範例下載中的 MyArray

{
  "array": {
    "entries": {
      "0": "value00",
      "1": "value10",
      "2": "value20",
      "4": "value40",
      "5": "value50"
    }
  }
}

下列程式碼會將 MyArray 新增至設定提供者:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("MyArray.json", 
                    optional: true, 
                    reloadOnChange: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

下列程式碼會讀取設定,並顯示這些值:

public class ArrayModel : PageModel
{
    private readonly IConfiguration Config;
    public ArrayExample _array { get; private set; }

    public ArrayModel(IConfiguration config)
    {
        Config = config;
    }

    public ContentResult OnGet()
    {
        _array = Config.GetSection("array").Get<ArrayExample>();
        string s = null;

        for (int j = 0; j < _array.Entries.Length; j++)
        {
            s += $"Index: {j}  Value:  {_array.Entries[j]} \n";
        }

        return Content(s);
    }
}

上述程式碼會傳回下列輸出:

Index: 0  Value: value00
Index: 1  Value: value10
Index: 2  Value: value20
Index: 3  Value: value40
Index: 4  Value: value50

在上述輸出中,索引3有值 value40 ,對應于 "4": "value40", MyArray 中。 系結陣列索引是連續的,不會系結至設定索引鍵索引。 設定系結器無法系結 null 值,或在系結物件中建立 null 專案

下列程式碼會 array:entries 使用 AddInMemoryCollection 擴充方法載入設定:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var arrayDict = new Dictionary<string, string>
        {
            {"array:entries:0", "value0"},
            {"array:entries:1", "value1"},
            {"array:entries:2", "value2"},
            //              3   Skipped
            {"array:entries:4", "value4"},
            {"array:entries:5", "value5"}
        };

        return Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddInMemoryCollection(arrayDict);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    }
}

下列程式碼會讀取中的設定 arrayDict Dictionary ,並顯示這些值:

public class ArrayModel : PageModel
{
    private readonly IConfiguration Config;
    public ArrayExample _array { get; private set; }

    public ArrayModel(IConfiguration config)
    {
        Config = config;
    }

    public ContentResult OnGet()
    {
        _array = Config.GetSection("array").Get<ArrayExample>();
        string s = null;

        for (int j = 0; j < _array.Entries.Length; j++)
        {
            s += $"Index: {j}  Value:  {_array.Entries[j]} \n";
        }

        return Content(s);
    }
}

上述程式碼會傳回下列輸出:

Index: 0  Value: value0
Index: 1  Value: value1
Index: 2  Value: value2
Index: 3  Value: value4
Index: 4  Value: value5

繫結物件中的索引 #3 存放 array:4 設定機碼與其 value4 的設定資料。 系結包含陣列的設定資料時,在建立物件時,會使用設定機碼中的陣列索引來反覆運算設定資料。 設定資料中不能保留 Null 值,當設定機碼中的陣列略過一或多個索引時,不會在繫結物件中建立 Null 值項目。

在系 # 結至實例之前,您可以藉 ArrayExample 由讀取索引 # 3 索引鍵/值組的任何設定提供者,在系結至實例之前,提供索引3的遺漏設定專案。 請考慮範例下載中的下列 Value3 檔案:

{
  "array:entries:3": "value3"
}

下列程式碼包含 Value3 的設定和 arrayDict Dictionary

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var arrayDict = new Dictionary<string, string>
        {
            {"array:entries:0", "value0"},
            {"array:entries:1", "value1"},
            {"array:entries:2", "value2"},
            //              3   Skipped
            {"array:entries:4", "value4"},
            {"array:entries:5", "value5"}
        };

        return Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddInMemoryCollection(arrayDict);
                config.AddJsonFile("Value3.json",
                                    optional: false, reloadOnChange: false);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    }
}

下列程式碼會讀取先前的設定,並顯示這些值:

public class ArrayModel : PageModel
{
    private readonly IConfiguration Config;
    public ArrayExample _array { get; private set; }

    public ArrayModel(IConfiguration config)
    {
        Config = config;
    }

    public ContentResult OnGet()
    {
        _array = Config.GetSection("array").Get<ArrayExample>();
        string s = null;

        for (int j = 0; j < _array.Entries.Length; j++)
        {
            s += $"Index: {j}  Value:  {_array.Entries[j]} \n";
        }

        return Content(s);
    }
}

上述程式碼會傳回下列輸出:

Index: 0  Value: value0
Index: 1  Value: value1
Index: 2  Value: value2
Index: 3  Value: value3
Index: 4  Value: value4
Index: 5  Value: value5

自訂設定提供者不需要實作陣列繫結。

自訂設定提供者

範例應用程式示範如何建立會使用 Entity Framework (EF) 從資料庫讀取設定機碼值組的基本設定提供者。

提供者具有下列特性:

  • EF 記憶體內資料庫會用於示範用途。 若要使用需要連接字串的資料庫,請實作第二個 ConfigurationBuilder 以從另一個設定提供者提供連接字串。
  • 啟動時,該提供者會將資料庫資料表讀入到設定中。 該提供者不會以個別機碼為基礎查詢資料庫。
  • 未實作變更時重新載入,因此在應用程式啟動後更新資料庫對應用程式設定沒有影響。

定義 EFConfigurationValue 實體來在資料庫中存放設定值。

Models/EFConfigurationValue.cs

public class EFConfigurationValue
{
    public string Id { get; set; }
    public string Value { get; set; }
}

新增 EFConfigurationContext 以存放及存取已設定的值。

EFConfigurationProvider/EFConfigurationContext.cs

// using Microsoft.EntityFrameworkCore;

public class EFConfigurationContext : DbContext
{
    public EFConfigurationContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<EFConfigurationValue> Values { get; set; }
}

建立會實作 IConfigurationSource 的類別。

EFConfigurationProvider/EFConfigurationSource.cs

// using Microsoft.EntityFrameworkCore;
// using Microsoft.Extensions.Configuration;

public class EFConfigurationSource : IConfigurationSource
{
    private readonly Action<DbContextOptionsBuilder> _optionsAction;

    public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction)
    {
        _optionsAction = optionsAction;
    }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new EFConfigurationProvider(_optionsAction);
    }
}

透過繼承自 ConfigurationProvider 來建立自訂設定提供者。 若資料庫是空的,設定提供者會初始化資料庫。 由於設定索引鍵不區分大小寫,因此用來初始化資料庫的字典會以不區分大小寫的比較子來建立 (stringcomparison. OrdinalIgnoreCase) 。

EFConfigurationProvider/EFConfigurationProvider.cs

// using Microsoft.EntityFrameworkCore;
// using Microsoft.Extensions.Configuration;

public class EFConfigurationProvider : ConfigurationProvider
{
    public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
    {
        OptionsAction = optionsAction;
    }

    Action<DbContextOptionsBuilder> OptionsAction { get; }

    public override void Load()
    {
        var builder = new DbContextOptionsBuilder<EFConfigurationContext>();

        OptionsAction(builder);

        using (var dbContext = new EFConfigurationContext(builder.Options))
        {
            dbContext.Database.EnsureCreated();

            Data = !dbContext.Values.Any()
                ? CreateAndSaveDefaultValues(dbContext)
                : dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
        }
    }

    private static IDictionary<string, string> CreateAndSaveDefaultValues(
        EFConfigurationContext dbContext)
    {
        // Quotes (c)2005 Universal Pictures: Serenity
        // https://www.uphe.com/movies/serenity
        var configValues = 
            new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
            {
                { "quote1", "I aim to misbehave." },
                { "quote2", "I swallowed a bug." },
                { "quote3", "You can't stop the signal, Mal." }
            };

        dbContext.Values.AddRange(configValues
            .Select(kvp => new EFConfigurationValue 
                {
                    Id = kvp.Key,
                    Value = kvp.Value
                })
            .ToArray());

        dbContext.SaveChanges();

        return configValues;
    }
}

AddEFConfiguration 擴充方法允許新增設定來源到 ConfigurationBuilder

Extensions/EntityFrameworkExtensions.cs:

// using Microsoft.EntityFrameworkCore;
// using Microsoft.Extensions.Configuration;

public static class EntityFrameworkExtensions
{
    public static IConfigurationBuilder AddEFConfiguration(
        this IConfigurationBuilder builder, 
        Action<DbContextOptionsBuilder> optionsAction)
    {
        return builder.Add(new EFConfigurationSource(optionsAction));
    }
}

下列程式碼顯示如何在 Program.cs 中使用自訂 EFConfigurationProvider

// using Microsoft.EntityFrameworkCore;

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddEFConfiguration(
                options => options.UseInMemoryDatabase("InMemoryDb"));
        })

在啟動時存取設定

下列程式碼會在方法中顯示設定資料 Startup

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        Console.WriteLine($"MyKey : {Configuration["MyKey"]}");
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        Console.WriteLine($"Position:Title : {Configuration["Position:Title"]}");

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

如需使用啟動方便方法來存取設定的範例,請參閱應用程式啟動:方便方法

存取頁面中的設定 Razor

下列程式碼會在頁面中顯示設定資料 Razor :

@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

Configuration value for 'MyKey': @Configuration["MyKey"]

在下列程式碼中, MyOptions 會新增至服務容器, Configure 並系結至設定:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));

    services.AddRazorPages();
}

下列標記會使用指示詞 @inject Razor 來解析和顯示選項值:

@page
@model SampleApp.Pages.Test3Model
@using Microsoft.Extensions.Options
@inject IOptions<MyOptions> optionsAccessor


<p><b>Option1:</b> @optionsAccessor.Value.Option1</p>
<p><b>Option2:</b> @optionsAccessor.Value.Option2</p>

MVC view 檔案中的存取設定

下列程式碼會顯示 MVC 視圖中的設定資料:

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

Configuration value for 'MyKey': @Configuration["MyKey"]

使用委派設定選項

在委派中設定的選項會覆寫設定提供者中所設定的值。

使用委派來設定選項,會示範為範例應用程式中的範例2。

在下列程式碼中, IConfigureOptions<TOptions> 服務會新增至服務容器。 它會使用委派來設定下列值 MyOptions

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyOptions>(myOptions =>
    {
        myOptions.Option1 = "Value configured in delegate";
        myOptions.Option2 = 500;
    });

    services.AddRazorPages();
}

下列程式碼會顯示選項值:

public class Test2Model : PageModel
{
    private readonly IOptions<MyOptions> _optionsDelegate;

    public Test2Model(IOptions<MyOptions> optionsDelegate )
    {
        _optionsDelegate = optionsDelegate;
    }

    public ContentResult OnGet()
    {
        return Content($"Option1: {_optionsDelegate.Value.Option1} \n" +
                       $"Option2: {_optionsDelegate.Value.Option2}");
    }
}

在上述範例中,和的值 Option1 Option2 是在中指定, appsettings.json 然後由設定的委派覆寫。

主機與應用程式組態的比較

設定及啟動應用程式之前,會先設定及啟動「主機」。 主機負責應用程式啟動和存留期管理。 應用程式與主機都是使用此主題中所述的設定提供者來設定的。 主機組態機碼/值組也會包含在應用程式的組態中。 如需有關當建置主機時如何使用設定提供者的詳細資訊,以及設定來源如何影響主機設定的詳細資訊,請參閱 ASP.NET Core 基本概念

預設主機設定

如需使用 Web 主機時預設組態的詳細資料,請參閱本主題的 ASP.NET Core 2.2 版本

  • 主機組態的提供來源:
    • 前面加 DOTNET_ 上 (的環境變數,例如, DOTNET_ENVIRONMENT 使用 環境變數設定提供者) 。 載入設定機碼值組時,會移除前置詞 (DOTNET_)。
    • 使用命令列設定提供者的命令列引數。
  • 已建立 Web 主機預設組態 (ConfigureWebHostDefaults):
    • Kestrel 會當做 web 伺服器使用,並使用應用程式的設定提供者進行設定。
    • 新增主機篩選中介軟體。
    • 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 環境變數設定為 true,則會新增轉接的標頭中介軟體。
    • 啟用 IIS 整合。

其他設定

本主題僅適用于 應用程式 設定。 執行和主控 ASP.NET Core 應用程式的其他層面,是使用本主題未涵蓋的設定檔來設定:

launchsettings.json 中設定的環境變數會覆寫系統內容中所設定的環境變數。

如需從舊版 ASP.NET 遷移應用程式設定的詳細資訊,請參閱 從 ASP.NET 移轉至 ASP.NET Core

從外部組件新增設定

IHostingStartup 實作允許在啟動時從應用程式 Startup 類別外部的外部組件,針對應用程式新增增強功能。 如需詳細資訊,請參閱在 ASP.NET Core 中使用裝載啟動組件

其他資源