ASP.NET Core'de yapılandırma

Rick Anderson ve Rick Larkin

Yapılandırma ASP.NET Core bir veya daha fazla yapılandırma sağlayıcısı kullanılarak gerçekleştirilir. Yapılandırma sağlayıcıları, çeşitli yapılandırma kaynaklarını kullanarak anahtar-değer çiftlerinden yapılandırma verilerini okur:

  • Ayarlar dosyaları, örneğin appsettings.json
  • Ortam değişkenleri
  • Azure Key Vault
  • Azure Uygulama Yapılandırması
  • Komut satırı bağımsız değişkenleri
  • Özel sağlayıcılar, yüklenmiş veya oluşturulmuş
  • Dizin dosyaları
  • Bellek içinde .NET nesneleri

Bu konu başlığı altında, ASP.NET Core. Konsol uygulamalarına yapılandırma kullanma hakkında bilgi için bkz. .NET Yapılandırması.

Örnek kodu görüntüleme veya indirme ( nasılindir)

Varsayılan yapılandırma

ASP.NET Core yeni dotnet veya Visual Studio web uygulamaları oluşturmak için aşağıdaki kodu oluşturun:

var builder = WebApplication.CreateBuilder(args);

WebApplication.CreateBuilder önceden yapılandırılmış varsayılanlarla sınıfının WebApplicationBuilder yeni bir örneğini başlatıyor. Başlatılan WebApplicationBuilder ( builder ) aşağıdaki sırayla uygulama için varsayılan yapılandırmayı sağlar:

  1. ChainedConfigurationProvider: Var olan bir IConfiguration kaynak olarak ekler. Varsayılan yapılandırma örneğinde, konak yapılandırmasını ekler ve uygulama yapılandırması için ilk kaynak olarak ayarlar.
  2. appsettings.jsonJSON yapılandırma sağlayıcısını kullanarak.
  3. uygulama ayarları. Environment JSON yapılandırma sağlayıcısını kullanan .json. Örneğin, appsettings. Üretim_._json ve uygulama ayarları.\Development** _._json*.
  4. Uygulama ortamda çalıştır geldiğinde uygulama gizli Development dizileri.
  5. Ortam Değişkenleri yapılandırma sağlayıcısını kullanan ortam değişkenleri.
  6. Komut satırı yapılandırma sağlayıcısını kullanan komut satırı bağımsız değişkenleri.

Daha sonra eklenen yapılandırma sağlayıcıları önceki anahtar ayarlarını geçersiz kılar. Örneğin, hem MyKey hem de ortamında appsettings.json ayarlanırsa ortam değeri kullanılır. Varsayılan yapılandırma sağlayıcılarını kullanan Komut satırı yapılandırma sağlayıcısı diğer tüm sağlayıcıları geçersiz kılar.

hakkında daha fazla bilgi için CreateBuilder bkz. Varsayılan oluşturucu ayarları.

Aşağıdaki kod, etkinleştirilmiş yapılandırma sağlayıcılarını eklendiklerine göre görüntüler:

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

Aşağıdaki dosyayı göz appsettings.json önünde bulun:

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

Örnek indirmeden alınan aşağıdaki kod, önceki yapılandırma ayarlarından birkaçı gösterir:

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}");
    }
}

Varsayılan, JsonConfigurationProvider yapılandırmayı aşağıdaki sırayla yükler:

  1. appsettings.json
  2. uygulama ayarları. Environment .json: Örneğin, appsettings. Üretim_._json ve appsettings.\Development** _._json* dosyaları. Dosyanın ortam sürümü, IHostingEnvironment.EnvironmentName temel alınır. Daha fazla bilgi için bkz. ASP.NET Core'da birden çok ortam kullanma.

appsettings Environment . json değerleri içinde anahtarları geçersiz appsettings.json kılar. Örneğin, varsayılan olarak:

  • Geliştirme aşamasında appsettings.Development _._json yapılandırması içinde bulunan değerlerin üzerine appsettings.json yazıyor.
  • Üretimde appsettings.Production _._json yapılandırması içinde bulunan değerlerin üzerine appsettings.json yazıyor. Örneğin, uygulamayı Azure'a dağıtırken.

Bir yapılandırma değeri garanti altına almak gerekirse bkz. GetValue. Yukarıdaki örnek yalnızca dizeleri okur ve varsayılan değeri desteklemez.

Varsayılan yapılandırmayı kullanarak ve appsettings.json uygulama ayarları. Environment .json dosyaları reloadOnChange: true ile etkinleştirilir. ve uygulama ayarları appsettings.json üzerinde yapılan değişiklikler. Environment Uygulama başladıktan sonra .json dosyası JSON yapılandırma sağlayıcısı tarafından okunur.

Seçenekler desenini kullanarak hiyerarşik yapılandırma verilerini bağlama

İlgili yapılandırma değerlerini okumanın tercih edilen yolu seçenekler desenini kullanmaktır. Örneğin, aşağıdaki yapılandırma değerlerini okumak için:

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

Aşağıdaki sınıfı PositionOptions oluşturun:

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

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

Options sınıfı:

  • Genel parametresiz oluşturucu ile soyut olmayan olmalıdır.
  • Türün tüm genel okuma-yazma özellikleri bağımlıdır.
  • Alanlar bağlı değildir. Yukarıdaki Position kodda, bağlı değildir. Positionözelliği kullanılır, böylece "Position" sınıfı bir yapılandırma sağlayıcısına bağlarken dizenin uygulamada sabit koda sahip olması gerek yoktur.

Aşağıdaki kod:

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}");
    }
}

Önceki kodda, varsayılan olarak, uygulama başlatıldıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunur.

ConfigurationBinder.Get<T> belirtilen türü bağlar ve döndürür. ConfigurationBinder.Get<T> kullanmaktan daha kullanışlı ConfigurationBinder.Bind olabilir. Aşağıdaki kod, sınıfıyla nasıl ConfigurationBinder.Get<T> kullanabileceğini PositionOptions gösterir:

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}");
    }
}

Önceki kodda, varsayılan olarak, uygulama başlatıldıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunur.

  • seçenekler deseni _ kullanılırken alternatif bir yaklaşım bölümü bağlamak ve bağımlılık ekleme hizmeti Position kapsayıcısı eklemektir. Aşağıdaki kodda, PositionOptions ile hizmet kapsayıcısı eklenir ve <xref:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure_> yapılandırmaya bağlıdır:
using ConfigSample.Options;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

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

var app = builder.Build();

Aşağıdaki kod, yukarıdaki kodu kullanarak konum seçeneklerini okur:

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}");
    }
}

Yukarıdaki kodda, uygulama başlatıldıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunmaz. Uygulama başlatıldıktan sonra değişiklikleri okumak için IOptionsSnapshot kullanın.

Varsayılan yapılandırmayı kullanarak ve appsettings.json uygulama ayarları. Environment .json dosyaları reloadOnChange: true ile etkinleştirilir. ve uygulama ayarları appsettings.json üzerinde yapılan değişiklikler. Environment Uygulama başladıktan sonra .json dosyası JSON yapılandırma sağlayıcısı tarafından okunur.

Ek JSON yapılandırma dosyaları ekleme hakkında bilgi için bu belgede JSON yapılandırma sağlayıcısına bakın.

Hizmet koleksiyonunu birleştirme

Hizmetleri kaydeden ve seçenekleri yapılandıran aşağıdakileri göz önünde bulundurun:

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();

İlgili kayıt grupları, Hizmetleri kaydetmek için bir genişletme yöntemine taşınabilir. Örneğin, Yapılandırma Hizmetleri aşağıdaki sınıfa eklenir:

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;
        }
    }
}

Kalan hizmetler benzer bir sınıfa kaydedilir. Aşağıdaki kod, Hizmetleri kaydetmek için yeni genişletme yöntemlerini kullanır:

using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;

var builder = WebApplication.CreateBuilder(args);

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

builder.Services.AddRazorPages();

var app = builder.Build();

Note: Her services.Add{GROUP_NAME} uzantı yöntemi, Hizmetleri ekler ve potansiyel olarak yapılandırır. Örneğin, AddControllersWithViews görünümler için gereken HIZMETLERI MVC denetleyicileri ekler ve AddRazorPages hizmet Razor sayfalarını ekler. Uygulamaların ad alanında uzantı yöntemleri oluşturma adlandırma kuralını izlemesini öneririz Microsoft.Extensions.DependencyInjection . Ad alanında uzantı yöntemleri oluşturma Microsoft.Extensions.DependencyInjection :

  • Hizmet kaydı gruplarını kapsüller.
  • Hizmete uygun IntelliSense erişimi sağlar.

Güvenlik ve kullanıcı gizli dizileri

Yapılandırma verileri yönergeleri:

  • Parolaları veya diğer hassas verileri hiçbir zaman yapılandırma sağlayıcısı kodunda veya düz metin yapılandırma dosyalarında depolamayın. Gizli Dizi Yöneticisi aracı, geliştirmede gizli dizileri depolamak için kullanılabilir.
  • Geliştirme veya test ortamlarında üretim gizli dizilerini kullanmayın.
  • Gizli dizileri proje dışında belirterek yanlışlıkla bir kaynak kodu deposuna işlenemezseniz.

Varsayılan olarak,kullanıcı gizli dizileri yapılandırma kaynağı JSON yapılandırma kaynaklarından sonra kaydedilir. Bu nedenle, kullanıcı gizli dizileri anahtarları ve uygulama appsettings.json ayarları'daki anahtarlara göre önceliklidir. Environment .json.

Parolaları veya diğer hassas verileri depolama hakkında daha fazla bilgi için:

Azure Key Vault uygulamalar için uygulama gizli dizilerini güvenli ASP.NET Core depolar. Daha fazla bilgi için bkz. ASP.NET Core Azure Key Vault yapılandırma sağlayıcısı.

Ortam değişkenleri

Varsayılan yapılandırmayı kullanarak, uygulama EnvironmentVariablesConfigurationProvider ayarları okunduktan sonra ortam değişkeni anahtar-değer çiftlerinden appsettings.json yapılandırmayı yükler. Environment .json ve kullanıcı gizli dizileri. Bu nedenle, ortamdan okunan anahtar appsettings.json değerleri, uygulamasından okunan değerleri geçersiz kılar. Environment .json ve kullanıcı gizli dizileri.

Ayırıcı, : tüm platformlarda ortam değişkeni hiyerarşik anahtarlarla birlikte çalışmaz. __çift alt çizgi şöyledir:

  • Tüm platformlar tarafından de destekler. Örneğin, : ayıracı Bash tarafından desteklanmaz,ancak __ bu şekildedir.
  • Otomatik olarak bir ile değiştirilir :

Aşağıdaki set komutlar:

  • Yukarıdaki örnekteki ortam anahtarlarını ve değerlerini Windows.
  • Örnek indirmeyi kullanırken ayarları test edin. Komutun dotnet run proje dizininde çalışması gerekir.
set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run

Yukarıdaki ortam ayarları:

  • Yalnızca ayarlandıkları komut penceresinden başlatılan işlemlerde ayarlanır.
  • Bu, tarayıcılar tarafından Visual Studio.

Aşağıdaki setx komutları, ortam anahtarlarını ve değerlerini Windows. 'den set setx farklı olarak ayarlar kalıcıdır. /M , sistem ortamında değişkeni ayarlar. Anahtar /M kullanılmazsa bir kullanıcı ortam değişkeni ayarlanır.

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

Yukarıdaki komutların ve appsettings.json appsettings'in geçersiz kılınarak test etmek için. Environment .json:

  • Şu Visual Studio: Çıkış ve yeniden başlatma Visual Studio.
  • CLI ile: Yeni bir komut penceresi başlatıp dotnet run girin.

Ortam AddEnvironmentVariables değişkenleri için bir ön ek belirtmek için bir dize ile çağrısı:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

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

var app = builder.Build();

Yukarıdaki kodda:

Yapılandırma anahtar-değer çiftleri okunurken ön ek çıkarılmış olur.

Aşağıdaki komutlar özel ön eki test ediyor:

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

Varsayılan yapılandırma, ve ön ekli ortam değişkenlerini ve komut satırı bağımsız değişkenlerini DOTNET_ ASPNETCORE_ yükler. ve DOTNET_ ön ASPNETCORE_ ekleri, ASP.NET Core ve uygulama yapılandırması için kullanılır,ancak kullanıcı yapılandırması için kullanılamaz. Konak ve uygulama yapılandırması hakkında daha fazla bilgi için bkz. .NET Genel Ana Bilgisayarı.

Yeni Azure App Servicesayfasında Yeni uygulama ayarı'Ayarlar > seçin. Azure App Service ayarları şu şekildedir:

  • Istirahatta şifrelenir ve şifrelenmiş bir kanal üzerinden iletilir.
  • Ortam değişkenleri olarak ortaya çıkar.

Daha fazla bilgi için bkz. Azure Uygulamaları: Azure Portalını kullanarak uygulama yapılandırmasını geçersiz kılma.

Azure veritabanı bağlantı dizeleri hakkında bilgi için bkz. bağlantı dizesi önekleri .

Ortam değişkenlerinin adlandırılması

Ortam değişkeni adları bir dosyanın yapısını yansıtır appsettings.json . Hiyerarşideki her öğe çift alt çizgi (tercih edilen) veya iki nokta üst üste ile ayrılır. Öğe yapısı bir dizi içerdiğinde, dizi dizini bu yolda ek bir öğe adı olarak değerlendirilmelidir. Aşağıdaki appsettings.json dosyayı ve ortam değişkenleri olarak temsil edilen eşdeğer değerlerini göz önünde bulundurun.

appsettings.json

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

ortam değişkenleri

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

Oluşturulan launchSettings. JSON öğesinde ayarlanan ortam değişkenleri

Launchsettings. JSON dosyasında ayarlanan ortam değişkenleri, Sistem ortamındaki kümeyi geçersiz kılar. örneğin, ASP.NET Core web şablonları, uç nokta yapılandırmasını şu şekilde ayarlayan bir launchsettings. json dosyası oluşturur:

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

Öğesini yapılandırmak, applicationUrl ASPNETCORE_URLS ortam değişkenini ayarlar ve ortamda ayarlanan değerleri geçersiz kılar.

Linux 'ta kaçış ortamı değişkenleri

Linux 'ta, URL ortam değişkenlerinin değeri, bunu ayrıştırabilmesi için kaçışmalıdır systemd . Veren Linux aracını kullanın systemd-escape``http:--localhost:5001

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

Ortam değişkenlerini görüntüle

Aşağıdaki kod, uygulama başlangıcında ortam değişkenlerini ve değerlerini görüntüler; bu, ortam ayarlarında hata ayıklarken yararlı olabilir:

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);
}

Komut Satırı

Varsayılan yapılandırmayı kullanarak, CommandLineConfigurationProvider aşağıdaki yapılandırma kaynaklarından sonra komut satırı bağımsız değişkeninden anahtar-değer çiftlerinden yapılandırma yükler:

  • appsettings.json ve appSettings. Environment . JSON dosyaları.
  • Geliştirme ortamında uygulama gizli dizileri.
  • Ortam değişkenleri.

Varsayılanolarak, komut satırı geçersiz kılma yapılandırma değerleri, diğer tüm yapılandırma sağlayıcılarıyla ayarlanan yapılandırma değerleri olarak ayarlanır.

Komut satırı bağımsız değişkenleri

Aşağıdaki komut kullanarak anahtarları ve değerleri ayarlar = :

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

Aşağıdaki komut kullanarak anahtarları ve değerleri ayarlar / :

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

Aşağıdaki komut kullanarak anahtarları ve değerleri ayarlar -- :

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

Anahtar değeri:

  • =' İ izlemelidir, ya da anahtarın bir -- / boşluk izleyen değeri veya öneki olmalıdır.
  • Kullanılıyorsa gerekli değildir = . Örneğin, MySetting=.

Aynı komut içinde, = bir boşluk kullanan anahtar-değer çiftleri ile birlikte kullanılan komut satırı bağımsız değişkeni anahtar-değer çiftlerini karıştırmayın.

Eşleme Değiştir

Anahtar eşlemeleri anahtar adı değiştirme mantığına izin verir. Metoda anahtar değiştirme sözlüğü sağlar AddCommandLine .

Anahtar eşlemeleri sözlüğü kullanıldığında, sözlük bir komut satırı bağımsız değişkeni tarafından sunulan anahtarla eşleşen bir anahtar için denetlenir. Komut satırı anahtarı sözlükte bulunursa, sözlük değeri, anahtar-değer çiftini uygulamanın yapılandırmasına ayarlamak için geri geçirilir. Tek tireyle () ön eki eklenmiş herhangi bir komut satırı anahtarı için bir anahtar eşlemesi gereklidir - .

Anahtar eşlemeleri sözlük anahtarı kuralları:

  • Anahtarlar veya ile başlamalıdır - -- .
  • Anahtar eşlemeleri sözlüğü yinelenen anahtarlar içermemelidir.

Anahtar eşlemeleri sözlüğünü kullanmak için, çağrısı içine geçirin 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();

Anahtar değişimini test etmek için aşağıdaki komutu çalıştırın:

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

Aşağıdaki kod, değiştirilmiş anahtarların anahtar değerlerini gösterir:

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"]}'");
    }
}

Anahtar eşlemeleri kullanan uygulamalar için, ' ye yapılan çağrı CreateDefaultBuilder bağımsız değişkenleri geçirmez. CreateDefaultBuilderYöntemin AddCommandLine çağrısı eşlenmiş anahtarlar içermez ve anahtar eşleme sözlüğünü öğesine geçirmenin bir yolu yoktur CreateDefaultBuilder . Çözüm, bağımsız değişkenleri öğesine geçirmektir, CreateDefaultBuilder bunun yerine ConfigurationBuilder metodun AddCommandLine yönteminin hem bağımsız değişkenleri hem de anahtar eşleme sözlüğünü işlemesini sağlar.

Ortam ve komut satırı bağımsız değişkenlerini Visual Studio ayarla

ortam ve komut satırı bağımsız değişkenleri, başlatma profilleri iletişim kutusundan Visual Studio ayarlanabilir:

  • Çözüm Gezgini ' de, projeyi sağ tıklatıp Özellikler' i seçin.
  • Hata ayıkla > genel sekmesini seçin ve hata ayıklama başlatma profilleri kullanıcı arabirimini aç' ı seçin.

Hiyerarşik yapılandırma verileri

Yapılandırma API 'SI, hiyerarşik verileri, yapılandırma anahtarlarında bir sınırlayıcı kullanımıyla birlikte düzleştirerek hiyerarşik yapılandırma verilerini okur.

Örnek indirme aşağıdaki appsettings.json dosyayı içerir:

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

Örnek indirmenin aşağıdaki kodu, yapılandırma ayarlarından birkaçını görüntüler:

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}");
    }
}

Hiyerarşik yapılandırma verilerini okumak için tercih edilen yol, Seçenekler modelini kullanmaktır. Daha fazla bilgi için, bkz. bu belgedeki Hiyerarşik yapılandırma verilerini bağlama .

GetSection ve GetChildren yapılandırma verileri bölümünün bölümlerini ve alt öğelerini yalıtmak için kullanılabilir. Bu yöntemler daha sonra GetSection, GetChildren ve Existsiçinde açıklanmıştır.

Yapılandırma anahtarları ve değerleri

Yapılandırma anahtarları:

  • Büyük/küçük harfe duyarsızdır. Örneğin, ConnectionString ve connectionstring eşdeğer anahtarlar olarak değerlendirilir.
  • Bir anahtar ve değer birden fazla yapılandırma sağlayıcısından ayarlandıysa, eklenen son sağlayıcıdan alınan değer kullanılır. Daha fazla bilgi için bkz. varsayılan yapılandırma.
  • Hiyerarşik anahtarlar
    • Yapılandırma API 'SI içinde, iki nokta üst üste ayırıcı ( : ) tüm platformlarda çalışmaktadır.
    • Ortam değişkenlerinde, tüm platformlarda bir iki nokta ayırıcı çalışmayabilir. Çift alt çizgi, __ tüm platformlar tarafından desteklenir ve otomatik olarak iki nokta olarak dönüştürülür : .
    • Azure Key Vault, hiyerarşik anahtarlar -- ayırıcı olarak kullanılır. Gizli diziler uygulamanın yapılandırmasına yüklendiğinde Azure Key Vault yapılandırma sağlayıcısı otomatik olarak -- bir ile değiştirilir : .
  • , ConfigurationBinder Yapılandırma anahtarlarındaki dizi dizinlerini kullanarak nesnelere dizileri bağlamayı destekler. Dizi bağlama, diziyi bir sınıfa bağlama bölümünde açıklanmıştır.

Yapılandırma değerleri:

  • Dizeler.
  • Null değerler yapılandırmada saklanamaz veya nesnelere bağlanabilir.

Yapılandırma sağlayıcıları

aşağıdaki tabloda ASP.NET Core uygulamalar için kullanılabilen yapılandırma sağlayıcıları gösterilmektedir.

Sağlayıcı Şuradan yapılandırma sağlar
Azure Key Vault yapılandırma sağlayıcısı Azure Key Vault
Azure uygulama yapılandırma sağlayıcısı Azure Uygulama Yapılandırması
Komut satırı yapılandırma sağlayıcısı Komut satırı parametreleri
Özel yapılandırma sağlayıcısı Özel kaynak
Ortam değişkenleri yapılandırma sağlayıcısı Ortam değişkenleri
Dosya yapılandırma sağlayıcısı INı, JSON ve XML dosyaları
Dosya başına anahtar yapılandırma sağlayıcısı Dizin dosyaları
Bellek yapılandırma sağlayıcısı Bellek içi Koleksiyonlar
Kullanıcı gizli dizileri Kullanıcı profili dizinindeki dosya

Yapılandırma kaynakları, yapılandırma sağlayıcılarının belirtilme sırasına göre okundu. Koddaki yapılandırma sağlayıcılarını, uygulamanın gerektirdiği temel yapılandırma kaynakları için önceliklere uyacak şekilde sıralayın.

Yapılandırma sağlayıcılarının tipik bir sırası şunlardır:

  1. appsettings.json
  2. appSettings. Environment . JSON
  3. Kullanıcı gizli dizileri
  4. Ortam değişkenleri yapılandırma sağlayıcısınıkullanarak ortam değişkenleri.
  5. Komut satırı yapılandırma sağlayıcısınıkullanan komut satırı bağımsız değişkenleri.

Ortak bir uygulama, komut satırı bağımsız değişkenlerinin diğer sağlayıcılar tarafından ayarlanan yapılandırmayı geçersiz kılmasına izin vermek için komut satırı yapılandırma sağlayıcısını en son bir sağlayıcı dizisine eklemektir.

Önceki sağlayıcı dizisi Varsayılan yapılandırmadakullanılır.

Bağlantı dizesi önekleri

Yapılandırma API 'sinin dört bağlantı dizesi ortam değişkeni için özel işleme kuralları vardır. Bu bağlantı dizeleri, uygulama ortamı için Azure bağlantı dizelerini yapılandırmaya dahil edilir. Tabloda gösterilen öneklerle ortam değişkenleri, varsayılan yapılandırmayla veya uygulamasına hiçbir önek sağlanmadığında uygulamaya yüklenir AddEnvironmentVariables .

Bağlantı dizesi öneki Sağlayıcı
CUSTOMCONNSTR_ Özel sağlayıcı
MYSQLCONNSTR_ MySQL
SQLAZURECONNSTR_ Azure SQL Veritabanı
SQLCONNSTR_ SQL Server

Bir ortam değişkeni keşfedildiğinde ve tabloda gösterilen dört önekle yapılandırmaya yüklendiğinde:

  • Yapılandırma anahtarı, ortam değişkeni öneki kaldırılarak ve bir yapılandırma anahtarı bölümü () eklenerek oluşturulur ConnectionStrings .
  • Veritabanı bağlantı sağlayıcısını temsil eden yeni bir yapılandırma anahtar-değer çifti oluşturulur (için CUSTOMCONNSTR_ , belirtilen sağlayıcı olmayan).
Ortam değişkeni anahtarı Dönüştürülen yapılandırma anahtarı Sağlayıcı yapılandırma girişi
CUSTOMCONNSTR_{KEY} ConnectionStrings:{KEY} Yapılandırma girişi oluşturulmamış.
MYSQLCONNSTR_{KEY} ConnectionStrings:{KEY} Anahtar: ConnectionStrings:{KEY}_ProviderName :
Değer: MySql.Data.MySqlClient
SQLAZURECONNSTR_{KEY} ConnectionStrings:{KEY} Anahtar: ConnectionStrings:{KEY}_ProviderName :
Değer: System.Data.SqlClient
SQLCONNSTR_{KEY} ConnectionStrings:{KEY} Anahtar: ConnectionStrings:{KEY}_ProviderName :
Değer: System.Data.SqlClient

Dosya yapılandırma sağlayıcısı

FileConfigurationProvider , dosya sisteminden yapılandırma yüklemeye yönelik temel sınıftır. Aşağıdaki yapılandırma sağlayıcıları öğesinden türetilir FileConfigurationProvider :

INı yapılandırma sağlayıcısı

, IniConfigurationProvider Çalışma ZAMANıNDA INI dosyası anahtar-değer çiftlerinden yapılandırmayı yükler.

Aşağıdaki kod tüm yapılandırma sağlayıcılarını temizler ve çeşitli yapılandırma sağlayıcıları ekler: [!code-csharp]

Yukarıdaki kodda, MyIniConfig.ini ve Myıniconfig içindeki Environment ayarlar. ını dosyaları, içindeki ayarlar tarafından geçersiz kılınır:

Örnek indirme , aşağıdaki MyIniConfig.ini dosyasını içerir:

MyKey="MyIniConfig.ini Value"

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

[Logging:LogLevel]
Default=Information
Microsoft=Warning

Örnek indirmenin aşağıdaki kodu, önceki yapılandırma ayarlarından birkaçını görüntüler:

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 yapılandırma sağlayıcısı

, JsonConfigurationProvider YAPıLANDıRMAYı JSON dosya anahtar-değer çiftleriyle yükler.

Aşırı yüklemeler şunları belirtebilir:

  • Dosyanın isteğe bağlı olup olmadığı.
  • Dosya değişirse yapılandırmanın yeniden yüklenip yüklenmediğini belirtir.

Aşağıdaki kodu inceleyin:

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();

Yukarıdaki kod:

Genellikle, ortam değişkenleri Yapılandırma sağlayıcısında ve komut satırı yapılandırma sağlayıcısındaayarlanmış özel bir JSON dosyası değerlerini geçersiz kılmayı istemezsiniz.

XML yapılandırma sağlayıcısı

, XmlConfigurationProvider Çalışma ZAMANıNDA XML dosya anahtar-değer çiftlerinden yapılandırmayı yükler.

Aşağıdaki kod tüm yapılandırma sağlayıcılarını temizler ve çeşitli yapılandırma sağlayıcıları ekler:

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();

Yukarıdaki kodda, MyXMLFile.xml ve myXMLfile içindeki ayarlar. Environment .. XML dosyaları, içindeki ayarlar tarafından geçersiz kılınır:

Örnek indirme , aşağıdaki MyXMLFile.xml dosyasını içerir:

<?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>

Örnek indirmenin aşağıdaki kodu, önceki yapılandırma ayarlarından birkaçını görüntüler:

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}");
    }
}

Aynı öğe adını kullanan yinelenen öğeler, name özniteliği öğeleri ayırt etmek için kullanılacaksa çalışır:

<?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>

Aşağıdaki kod, önceki yapılandırma dosyasını okur ve anahtarları ve değerleri görüntüler:

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"
                       );
    }
}

Öznitelikler, değerler sağlamak için kullanılabilir:

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

Önceki yapılandırma dosyası aşağıdaki anahtarları ile yükler value :

  • anahtar: öznitelik
  • Section: Key: özniteliği

Dosya başına anahtar yapılandırma sağlayıcısı

, KeyPerFileConfigurationProvider Dizin dosyalarını yapılandırma anahtar-değer çiftleri olarak kullanır. Anahtar, dosya adıdır. Değer, dosyanın içeriğini içerir. Dosya başına anahtar yapılandırma sağlayıcısı Docker barındırma senaryolarında kullanılır.

Dosya başına anahtar yapılandırmasını etkinleştirmek için, AddKeyPerFile bir örneğinde genişletme yöntemini çağırın ConfigurationBuilder . directoryPathDosyaların mutlak bir yol olması gerekir.

Aşırı yüklemeler belirtmeye izin ver:

  • Action<KeyPerFileConfigurationSource>Kaynağı yapılandıran bir temsilci.
  • Dizinin isteğe bağlı olup olmadığını ve dizinin yolunu belirtir.

Çift alt çizgi ( __ ), dosya adlarında yapılandırma anahtarı sınırlayıcısı olarak kullanılır. Örneğin, dosya adı Logging__LogLevel__System yapılandırma anahtarını üretir Logging:LogLevel:System .

ConfigureAppConfigurationUygulamanın yapılandırmasını belirtmek için Konağı oluştururken çağırın:

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

Bellek yapılandırma sağlayıcısı

, MemoryConfigurationProvider Yapılandırma anahtar-değer çiftleri olarak bellek içi koleksiyon kullanır.

Aşağıdaki kod, yapılandırma sistemine bir bellek koleksiyonu ekler:

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();

Örnek indirmenin aşağıdaki kodu, önceki yapılandırma ayarlarını görüntüler:

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}");
    }
}

Önceki kodda, config.AddInMemoryCollection(Dict) varsayılan yapılandırma sağlayıcılarındansonra eklenir. Yapılandırma sağlayıcılarını sipariş eden bir örnek için bkz. JSON yapılandırma sağlayıcısı.

Bkz. kullanarak bir diziyi başka bir örnek için bağlama MemoryConfigurationProvider .

Kestrel uç nokta yapılandırması

Kestrel belirli uç nokta yapılandırması tüm sunucular arası uç nokta yapılandırmalarını geçersiz kılar. Sunucular arası uç nokta yapılandırması şunları içerir:

bir ASP.NET Core web uygulamasında aşağıdaki dosyayı göz önünde bulundurun appsettings.json :

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

önceki vurgulanan biçimlendirme bir ASP.NET Core web uygulamasında kullanıldığında ve uygulama, komut satırında aşağıdaki çapraz sunucu uç noktası yapılandırmasıyla başlatıldığında:

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

KestrelKestrel, appsettings.json dosyasında () için özel olarak yapılandırılan bitiş noktasına bağlanır https://localhost:9999 https://localhost:7777 .

KestrelBir ortam değişkeni olarak yapılandırılmış belirli bir uç noktayı göz önünde bulundurun:

set Kestrel__Endpoints__Https__Url=https://localhost:8888

Önceki ortam değişkeninde, Https Kestrel belirli uç noktanın adıdır. Yukarıdaki appsettings.json Dosya Ayrıca Kestrel adlı belirli bir uç noktayı tanımlar Https . Varsayılanolarak, ortam değişkenleri yapılandırma sağlayıcısını kullanan ortam değişkenleri appSettings 'ten sonra okunurdur . Environment Bu nedenle, önceki ortam değişkeni Https uç nokta için kullanılır.

GetValue

ConfigurationBinder.GetValue<T> belirli bir anahtarla yapılandırmadan tek bir değer ayıklar ve belirtilen türe dönüştürür:

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}");
    }
}

Önceki kodda, NumberKey yapılandırmada bulunmazsa, varsayılan değeri 99 kullanılır.

GetSection, GetChildren ve Exists

İzleyen örnekler için aşağıdaki Myalt bölüm. JSON dosyasını göz önünde bulundurun:

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

Aşağıdaki kod, Myalt bölüm. JSON öğesini yapılandırma sağlayıcılarına ekler:

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

Iconation. GetSection , belirtilen alt bölüm anahtarıyla bir yapılandırma alt bölümü döndürüyor.

Aşağıdaki kod şu değerleri döndürür 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"]}'");
    }
}

Aşağıdaki kod şu değerleri döndürür 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 hiçbir süre geri döndürmez null . Eşleşen bir bölüm bulunamazsa boş IConfigurationSection değer döndürülür.

GetSectionEşleşen bir bölüm döndürdüğünde, Value doldurulmuyor. Bir Key ve Path , bölüm varsa döndürülür.

GetChildren ve Exists

Aşağıdaki kod, Iconation. GetChildren öğesini çağırır ve değerlerini döndürür 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);
    }
}

Yukarıdaki kod, bir bölümü doğrulamak için Configurationextensions. Exists öğesini çağırır:

Bir diziyi bağlama

Configurationciltçi. Bind , yapılandırma anahtarlarındaki dizi dizinlerini kullanarak dizilere dizi nesneleri bağlamayı destekler. Sayısal anahtar segmentini ortaya çıkaran herhangi bir dizi biçimi, poco sınıf dizisine dizi bağlama özelliğine sahiptir.

Örnek indirmenizde myArray. JSON ' i göz önünde bulundurun:

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

Aşağıdaki kod, yapılandırma sağlayıcılarına myArray. JSON ekler:

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();

Aşağıdaki kod yapılandırmayı okur ve değerleri görüntüler:

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);
    }
}

Yukarıdaki kod aşağıdaki çıktıyı döndürür:

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

Önceki çıktıda, Dizin 3 ' value40 "4": "value40", te, myArray. JSON içinde öğesine karşılık gelen bir değer vardır. Bağlantılı dizi dizinleri sürekli ve yapılandırma anahtarı diziniyle bağlantılı değildir. Yapılandırma Bağlayıcısı, bağlantılı nesnelerde null değerleri bağlama veya null girişler oluşturma yeteneğine sahip değil.

Özel yapılandırma sağlayıcısı

Örnek uygulama, Entity Framework (EF)kullanarak bir veritabanından yapılandırma anahtar-değer çiftlerini okuyan temel bir yapılandırma sağlayıcısı oluşturmayı gösterir.

Sağlayıcı aşağıdaki özelliklere sahiptir:

  • EF bellek içi veritabanı, tanıtım amacıyla kullanılır. Bağlantı dizesi gerektiren bir veritabanını kullanmak için, ConfigurationBuilder başka bir yapılandırma sağlayıcısından bağlantı dizesini sağlamak üzere bir ikincil uygulayın.
  • Sağlayıcı bir veritabanı tablosunu başlangıçta yapılandırmaya okur. Sağlayıcı, her anahtar temelinde veritabanını sorgulayamaz.
  • Değişiklik değişikliği uygulanmadı, bu nedenle uygulama başladıktan sonra veritabanının güncelleştirilmesi uygulamanın yapılandırması üzerinde hiçbir etkiye sahip değildir.

EFConfigurationValueYapılandırma değerlerini veritabanında depolamak için bir varlık tanımlayın.

Modeller/EFConfigurationValue. cs:

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

Bir EFConfigurationContext mağazaya ekleyin ve yapılandırılan değerlere erişin.

Efconfigurationprovider/EFConfigurationContext. cs:

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

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

Uygulayan bir sınıf oluşturun 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);
}

Öğesinden devralarak özel yapılandırma sağlayıcısını oluşturun ConfigurationProvider . Yapılandırma sağlayıcısı boş olduğunda veritabanını başlatır. Yapılandırma anahtarları büyük/küçük harfe duyarsız olduğundan, veritabanını başlatmak için kullanılan sözlük, büyük/küçük harf duyarsız karşılaştırıcı (StringComparer. OrdinalIgnoreCase) ile oluşturulur.

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;
    }
}

AddEFConfigurationGenişletme yöntemi, yapılandırma kaynağını bir öğesine eklemeye izin verir ConfigurationBuilder .

Uzantılar/EntityFrameworkExtensions. cs:

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

Aşağıdaki kod, özel EFConfigurationProvider program. cs' nin nasıl kullanılacağını gösterir:

//using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

app.Run();

Sayfalarda erişim yapılandırması Razor

Aşağıdaki kod, yapılandırma verilerini bir sayfada görüntüler Razor :

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

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

Aşağıdaki kodda, MyOptions ile hizmet kapsayıcısına eklenir Configure ve yapılandırmaya bağlanır:

using SampleApp.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

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

var app = builder.Build();

Aşağıdaki biçimlendirme, @inject Razor seçenek değerlerini çözümlemek ve göstermek için yönergesini kullanır:

@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 görünüm dosyasındaki erişim yapılandırması

Aşağıdaki kod, yapılandırma verilerini bir MVC görünümünde görüntüler:

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

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

Bir temsilciyle seçenekleri yapılandırma

Bir temsilci içinde yapılandırılan seçenekler yapılandırma sağlayıcılarında ayarlanan değerleri geçersiz kılar.

Aşağıdaki kodda, IConfigureOptions<TOptions> hizmet kapsayıcısına bir hizmet eklenir. Şu değerleri yapılandırmak için bir temsilci kullanır 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();

Aşağıdaki kod, seçenek değerlerini görüntüler:

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}");
    }
}

Önceki örnekte, Option1 ve değerleri Option2 içinde belirtilir appsettings.json ve sonra yapılandırılan temsilci tarafından geçersiz kılınır.

Uygulama yapılandırmasına karşı konak

Uygulama yapılandırıldıktan ve başlatılmadan önce, bir konak yapılandırılır ve başlatılır. Ana bilgisayar, uygulama başlatma ve ömür yönetiminden sorumludur. Hem uygulama hem de ana bilgisayar, bu konuda açıklanan yapılandırma sağlayıcıları kullanılarak yapılandırılır. Ana bilgisayar yapılandırma anahtar-değer çiftleri, uygulamanın yapılandırmasına de dahildir. Konak oluşturulduğunda yapılandırma sağlayıcılarının nasıl kullanıldığı ve yapılandırma kaynaklarının konak yapılandırmasını nasıl etkilediği hakkında daha fazla bilgi için bkz ASP.NET Core temelleri ..

Varsayılan konak yapılandırması

Web konağınıkullanırken varsayılan yapılandırmayla ilgili ayrıntılar için, bu konunun ASP.NET Core 2,2 sürümünebakın.

  • Ana bilgisayar yapılandırması şuradan sağlanır:
    • Ortam değişkenleri DOTNET_ DOTNET_ENVIRONMENT yapılandırma sağlayıcısıkullanılarak (örneğin,) ön eki olan ortam değişkenleri. DOTNET_Yapılandırma anahtar-değer çiftleri yüklendiğinde önek () çıkarılır.
    • Komut satırı yapılandırma sağlayıcısınıkullanan komut satırı bağımsız değişkenleri.
  • Web ana bilgisayar varsayılan yapılandırması oluşturuldu ( ConfigureWebHostDefaults ):
    • Kestrel Web sunucusu olarak kullanılır ve uygulamanın yapılandırma sağlayıcıları kullanılarak yapılandırılır.
    • Konak filtreleme ara yazılımı ekleyin.
    • Ortam değişkeni olarak ayarlanmışsa Iletilen üstbilgiler ara yazılımı ekleyin ASPNETCORE_FORWARDEDHEADERS_ENABLED true .
    • IIS tümleştirmesini etkinleştirin.

Diğer yapılandırma

Bu konu yalnızca uygulama yapılandırması ile ilgilidir. ASP.NET Core uygulamalarını çalıştırmanın diğer yönleri, bu konuda kapsanmayan yapılandırma dosyaları kullanılarak yapılandırılır:

Launchsettings. JSON dosyasında ayarlanan ortam değişkenleri, Sistem ortamındaki kümeyi geçersiz kılar.

ASP.NET 'ın önceki sürümlerinden uygulama yapılandırmasını geçirme hakkında daha fazla bilgi için bkz ASP.NET'den ASP.NET Core ..

Bir dış derlemeden yapılandırma Ekle

Uygulama IHostingStartup , uygulamanın sınıfı dışında bir dış derlemeden başlatma sırasında bir uygulamaya iyileştirmeler eklenmesine olanak sağlar Startup . Daha fazla bilgi için bkz. ASP.NET Core 'de barındırma başlangıç derlemelerini kullanın.

Ek kaynaklar

ASP.NET Core yapılandırma bir veya daha fazla yapılandırma sağlayıcısıkullanılarak gerçekleştirilir. Yapılandırma sağlayıcıları çeşitli yapılandırma kaynakları kullanarak anahtar-değer çiftlerinden yapılandırma verilerini okur:

  • Ayarlar dosyaları appsettings.json
  • Ortam değişkenleri
  • Azure Key Vault
  • Azure Uygulama Yapılandırması
  • Komut satırı bağımsız değişkenleri
  • Özel sağlayıcılar, yüklenmiş veya oluşturulmuş
  • Dizin dosyaları
  • Bellek içinde .NET nesneleri

Bu konu başlığı altında, ASP.NET Core. Konsol uygulamalarına yapılandırma kullanma hakkında bilgi için bkz. .NET Yapılandırması.

Örnek kodu görüntüleme veya indirme ( nasılindir)

Varsayılan yapılandırma

ASP.NET Core yeni dotnet veya Visual Studio web uygulamaları oluşturmak için aşağıdaki kodu oluşturun:

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 uygulama için varsayılan yapılandırmayı aşağıdaki sırayla sağlar:

  1. ChainedConfigurationProvider: Var olan bir IConfiguration kaynak olarak ekler. Varsayılan yapılandırma örneğinde, konak yapılandırmasını ekler ve uygulama yapılandırması için ilk kaynak olarak ayarlar.
  2. appsettings.jsonJSON yapılandırma sağlayıcısını kullanarak.
  3. uygulama ayarları. Environment JSON yapılandırma sağlayıcısını kullanan .json. Örneğin, appsettings. Üretim_._json ve uygulama ayarları.\Development** _._json*.
  4. Uygulama ortamda çalıştır geldiğinde uygulama gizli Development dizileri.
  5. Ortam Değişkenleri yapılandırma sağlayıcısını kullanan ortam değişkenleri.
  6. Komut satırı yapılandırma sağlayıcısını kullanan komut satırı bağımsız değişkenleri.

Daha sonra eklenen yapılandırma sağlayıcıları önceki anahtar ayarlarını geçersiz kılar. Örneğin, hem MyKey hem de ortamında appsettings.json ayarlanırsa ortam değeri kullanılır. Varsayılan yapılandırma sağlayıcılarını kullanan Komut satırı yapılandırma sağlayıcısı diğer tüm sağlayıcıları geçersiz kılar.

hakkında daha fazla bilgi için CreateDefaultBuilder bkz. Varsayılan oluşturucu ayarları.

Aşağıdaki kod, etkinleştirilmiş yapılandırma sağlayıcılarını eklendiklerine göre görüntüler:

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

Aşağıdaki dosyayı göz appsettings.json önünde bulun:

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

Örnek indirmeden alınan aşağıdaki kod, önceki yapılandırma ayarlarından birkaçı gösterir:

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}");
    }
}

Varsayılan, JsonConfigurationProvider yapılandırmayı aşağıdaki sırayla yükler:

  1. appsettings.json
  2. uygulama ayarları. Environment .json: Örneğin, appsettings. Üretim_._json ve appsettings.\Development** _._json* dosyaları. Dosyanın ortam sürümü, IHostingEnvironment.EnvironmentName temel alınır. Daha fazla bilgi için bkz. ASP.NET Core'da birden çok ortam kullanma.

appsettings Environment . json değerleri içinde anahtarları geçersiz appsettings.json kılar. Örneğin, varsayılan olarak:

  • Geliştirme aşamasında appsettings.Development _._json yapılandırması içinde bulunan değerlerin üzerine appsettings.json yazıyor.
  • Üretimde appsettings.Production _._json yapılandırması içinde bulunan değerlerin üzerine appsettings.json yazıyor. Örneğin, uygulamayı Azure'a dağıtırken.

Bir yapılandırma değeri garanti altına almak gerekirse bkz. GetValue. Yukarıdaki örnek yalnızca dizeleri okur ve varsayılan değeri desteklemez.

Varsayılan yapılandırmayı kullanarak ve appsettings.json uygulama ayarları. Environment .json dosyaları reloadOnChange: true ile etkinleştirilir. ve uygulama ayarları appsettings.json üzerinde yapılan değişiklikler. Environment Uygulama başladıktan sonra .json dosyası JSON yapılandırma sağlayıcısı tarafından okunur.

Seçenekler desenini kullanarak hiyerarşik yapılandırma verilerini bağlama

İlgili yapılandırma değerlerini okumak için tercih edilen yol, Seçenekler modelinikullanmaktır. Örneğin, aşağıdaki yapılandırma değerlerini okumak için:

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

Aşağıdaki sınıfı oluşturun PositionOptions :

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

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

Seçenekler sınıfı:

  • Ortak parametresiz bir oluşturucuya sahip olmayan Özet olmamalıdır.
  • Türün tüm genel okuma-yazma özellikleri bağlanır.
  • Alanlar bağlanmadı . Yukarıdaki kodda, Position bağlantılı değildir. PositionÖzelliği, "Position" sınıfı bir yapılandırma sağlayıcısına bağlarken, dizenin uygulamada sabit kodlanmış olması gerekmez.

Aşağıdaki kod:

  • Sınıfı bölümüne bağlamak için Configurationciltçi. Bind ' i çağırır PositionOptions Position .
  • PositionYapılandırma verilerini görüntüler.
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}");
    }
}

Yukarıdaki kodda, varsayılan olarak, uygulama başladıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunurdur.

ConfigurationBinder.Get<T> belirtilen türü bağlar ve döndürür. ConfigurationBinder.Get<T> , kullanmaktan daha uygun olabilir ConfigurationBinder.Bind . Aşağıdaki kod, sınıfıyla birlikte nasıl kullanılacağını gösterir 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}");
    }
}

Yukarıdaki kodda, varsayılan olarak, uygulama başladıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunurdur.

*Seçenek deseninin _ 'i kullanılırken alternatif bir yaklaşım, Position bölümü bağlamak ve bağımlılık ekleme hizmeti kapsayıcısınaeklemektir. Aşağıdaki kodda, PositionOptions ile hizmet kapsayıcısına eklenir <xref:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure_> ve yapılandırmaya bağlanır:

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

Önceki kodu kullanarak, aşağıdaki kod konum seçeneklerini okur:

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}");
    }
}

Yukarıdaki kodda, uygulama başladıktan sonra JSON yapılandırma dosyasında yapılan değişiklikler okunamaz. Uygulama başladıktan sonra değişiklikleri okumak için ıoptionssnapshotkullanın.

Varsayılan yapılandırmayı kullanarak ve appsettings.json uygulama ayarları. Environment .json dosyaları reloadOnChange: true ile etkinleştirilir. ve uygulama ayarları appsettings.json üzerinde yapılan değişiklikler. Environment Uygulama başladıktan sonra .json dosyası JSON yapılandırma sağlayıcısı tarafından okunur.

Ek JSON yapılandırma dosyaları ekleme hakkında bilgi için bu belgede JSON yapılandırma sağlayıcısına bakın.

Hizmet koleksiyonunu birleştirme

ConfigureServicesHizmetleri kaydeden ve seçenekleri yapılandıran aşağıdaki yöntemi göz önünde bulundurun:

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();
}

İlgili kayıt grupları, Hizmetleri kaydetmek için bir genişletme yöntemine taşınabilir. Örneğin, Yapılandırma Hizmetleri aşağıdaki sınıfa eklenir:

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;
        }
    }
}

Kalan hizmetler benzer bir sınıfa kaydedilir. Aşağıdaki ConfigureServices Yöntem, Hizmetleri kaydetmek için yeni genişletme yöntemlerini kullanır:

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

    services.AddRazorPages();
}

Note: Her services.Add{GROUP_NAME} uzantı yöntemi, Hizmetleri ekler ve potansiyel olarak yapılandırır. Örneğin, AddControllersWithViews görünümler için gereken HIZMETLERI MVC denetleyicileri ekler ve AddRazorPages hizmet Razor sayfalarını ekler. Uygulamaların ad alanında uzantı yöntemleri oluşturma adlandırma kuralını izlemesini öneririz Microsoft.Extensions.DependencyInjection . Ad alanında uzantı yöntemleri oluşturma Microsoft.Extensions.DependencyInjection :

  • Hizmet kaydı gruplarını kapsüller.
  • Hizmete uygun IntelliSense erişimi sağlar.

Güvenlik ve kullanıcı gizli dizileri

Yapılandırma verileri yönergeleri:

  • Parolaları veya diğer hassas verileri hiçbir zaman yapılandırma sağlayıcısı kodunda veya düz metin yapılandırma dosyalarında depolamayın. Gizli Dizi Yöneticisi aracı, geliştirmede gizli dizileri depolamak için kullanılabilir.
  • Geliştirme veya test ortamlarında üretim gizli dizilerini kullanmayın.
  • Gizli dizileri proje dışında belirterek yanlışlıkla bir kaynak kod deposuna işlenemezseniz.

Varsayılan olarak,kullanıcı gizli dizileri yapılandırma kaynağı JSON yapılandırma kaynaklarından sonra kaydedilir. Bu nedenle, kullanıcı gizli dizileri anahtarları ve uygulama appsettings.json ayarları'daki anahtarlara göre önceliklidir. Environment .json.

Parolaları veya diğer hassas verileri depolama hakkında daha fazla bilgi için:

Azure Key Vault uygulamalar için uygulama gizli dizilerini güvenli ASP.NET Core depolar. Daha fazla bilgi için bkz. ASP.NET Core Azure Key Vault yapılandırma sağlayıcısı.

Ortam değişkenleri

Varsayılan yapılandırmayı kullanarak , EnvironmentVariablesConfigurationProvider appsettings okunduktan sonra ortam değişkeni anahtar-değer appsettings.json çiftlerinden yapılandırmayı yükler. Environment .json ve kullanıcı gizli dizileri. Bu nedenle, ortamdan okunan anahtar appsettings.json değerleri, uygulamasından okunan değerleri geçersiz kılar. Environment .json ve kullanıcı gizli dizileri.

Ayırıcı, : tüm platformlarda ortam değişkeni hiyerarşik anahtarlarla birlikte çalışmaz. __çift alt çizgi şöyledir:

  • Tüm platformlar tarafından de destekler. Örneğin, : ayıracı Bash tarafından desteklanmaz,ancak __ bu şekildedir.
  • Otomatik olarak bir ile değiştirilir :

Aşağıdaki set komutlar:

  • Yukarıdaki örnekteki ortam anahtarlarını ve değerlerini Windows.
  • Örnek indirmeyi kullanırken ayarları test edin. Komutun dotnet run proje dizininde çalışması gerekir.
set MyKey="My key from Environment"
set Position__Title=Environment_Editor
set Position__Name=Environment_Rick
dotnet run

Yukarıdaki ortam ayarları:

  • Yalnızca ayarlandıkları komut penceresinden başlatılan işlemlerde ayarlanır.
  • Bu, tarayıcılar tarafından Visual Studio.

Aşağıdaki setx komutları, ortam anahtarlarını ve değerlerini Windows. 'den set setx farklı olarak ayarlar kalıcıdır. /M , sistem ortamında değişkeni ayarlar. Anahtar /M kullanılmazsa bir kullanıcı ortam değişkeni ayarlanır.

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

Yukarıdaki komutların ve appsettings.json appsettings'in geçersiz kılınarak test etmek için. Environment .json:

  • Şu Visual Studio: Çıkış ve yeniden başlatma Visual Studio.
  • CLI ile: Yeni bir komut penceresi başlatıp dotnet run girin.

Ortam AddEnvironmentVariables değişkenleri için bir ön ek belirtmek için bir dize ile çağrısı:

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>();
            });
}

Yukarıdaki kodda:

Yapılandırma anahtar-değer çiftleri okunurken ön ek çıkarılmış olur.

Aşağıdaki komutlar özel ön eki test ediyor:

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

Varsayılan yapılandırma, ve ön ekli ortam değişkenlerini ve komut satırı bağımsız değişkenlerini DOTNET_ ASPNETCORE_ yükler. ve DOTNET_ ön ASPNETCORE_ ekleri, ASP.NET Core ve uygulama yapılandırması için kullanılır,ancak kullanıcı yapılandırması için kullanılamaz. Konak ve uygulama yapılandırması hakkında daha fazla bilgi için bkz. .NET Genel Ana Bilgisayarı.

Yeni Azure App Servicesayfasında Yeni uygulama ayarı'Ayarlar > seçin. Azure App Service ayarları şu şekildedir:

  • Istirahatta şifrelenir ve şifrelenmiş bir kanal üzerinden iletilir.
  • Ortam değişkenleri olarak ortaya çıkar.

Daha fazla bilgi için bkz. Azure Uygulamaları: Azure Portalını kullanarak uygulama yapılandırmasını geçersiz kılma.

Azure veritabanı bağlantı dizeleri hakkında bilgi için bkz. Bağlantı dizesi ön ekleri.

Ortam değişkenlerini adlandırma

Ortam değişkeni adları bir dosyanın yapısını appsettings.json gösterir. Hiyerarşideki her öğe çift alt çizgi (tercih edilir) veya iki nokta üst üste ile ayrılır. Öğe yapısı bir dizi içerirken, dizi dizini bu yolda ek öğe adı olarak kabul edilmelidir. Aşağıdaki dosyayı ve appsettings.json ortam değişkenleri olarak temsil edilen eşdeğer değerlerini göz önünde bulundurabilirsiniz.

appsettings.json

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

ortam değişkenleri

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

Oluşturulan launchSettings.json'da ayarlanmış ortam değişkenleri

launchSettings.json içinde ayarlanmış ortam değişkenleri, sistem ortamındaki bu ayarları geçersiz kılar. Örneğin, web ASP.NET Core uç nokta yapılandırmasını ayarlayarak bir launchSettings.json dosyası oluşturur:

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

yapılandırma, applicationUrl ortam ASPNETCORE_URLS değişkenlerini ayarlar ve ortamda ayarlanmış değerleri geçersiz kılar.

Linux 'ta kaçış ortamı değişkenleri

Linux 'ta, URL ortam değişkenlerinin değeri, bunu ayrıştırabilmesi için kaçışmalıdır systemd . Veren Linux aracını kullanın systemd-escape``http:--localhost:5001

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

Ortam değişkenlerini görüntüle

Aşağıdaki kod, uygulama başlangıcında ortam değişkenlerini ve değerlerini görüntüler; bu, ortam ayarlarında hata ayıklarken yararlı olabilir:

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();
}

Komut Satırı

Varsayılan yapılandırmayı kullanarak, CommandLineConfigurationProvider aşağıdaki yapılandırma kaynaklarından sonra komut satırı bağımsız değişkeninden anahtar-değer çiftlerinden yapılandırma yükler:

  • appsettings.json ve appSettings. Environment . JSON dosyaları.
  • Geliştirme ortamında uygulama gizli dizileri.
  • Ortam değişkenleri.

Varsayılanolarak, komut satırı geçersiz kılma yapılandırma değerleri, diğer tüm yapılandırma sağlayıcılarıyla ayarlanan yapılandırma değerleri olarak ayarlanır.

Komut satırı bağımsız değişkenleri

Aşağıdaki komut kullanarak anahtarları ve değerleri ayarlar = :

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

Aşağıdaki komut kullanarak anahtarları ve değerleri ayarlar / :

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

Aşağıdaki komut kullanarak anahtarları ve değerleri ayarlar -- :

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

Anahtar değeri:

  • =' İ izlemelidir, ya da anahtarın bir -- / boşluk izleyen değeri veya öneki olmalıdır.
  • Kullanılıyorsa gerekli değildir = . Örneğin, MySetting=.

Aynı komut içinde, = bir boşluk kullanan anahtar-değer çiftleri ile birlikte kullanılan komut satırı bağımsız değişkeni anahtar-değer çiftlerini karıştırmayın.

Eşleme Değiştir

Anahtar eşlemeleri anahtar adı değiştirme mantığına izin verir. Metoda anahtar değiştirme sözlüğü sağlar AddCommandLine .

Anahtar eşlemeleri sözlüğü kullanıldığında, sözlük bir komut satırı bağımsız değişkeni tarafından sunulan anahtarla eşleşen bir anahtar için denetlenir. Komut satırı anahtarı sözlükte bulunursa, sözlük değeri, anahtar-değer çiftini uygulamanın yapılandırmasına ayarlamak için geri geçirilir. Tek tireyle () ön eki eklenmiş herhangi bir komut satırı anahtarı için bir anahtar eşlemesi gereklidir - .

Anahtar eşlemeleri sözlük anahtarı kuralları:

  • Anahtarlar veya ile başlamalıdır - -- .
  • Anahtar eşlemeleri sözlüğü yinelenen anahtarlar içermemelidir.

Anahtar eşlemeleri sözlüğünü kullanmak için, çağrısı içine geçirin 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>();
            });
    }
}

Aşağıdaki kod, değiştirilmiş anahtarların anahtar değerlerini gösterir:

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"]}'");
    }
}

Aşağıdaki komut, anahtar değişimini test etmek için işe yarar:

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

Anahtar eşlemeleri kullanan uygulamalar için, ' ye yapılan çağrı CreateDefaultBuilder bağımsız değişkenleri geçirmez. CreateDefaultBuilderYöntemin AddCommandLine çağrısı eşlenmiş anahtarlar içermez ve anahtar eşleme sözlüğünü öğesine geçirmenin bir yolu yoktur CreateDefaultBuilder . Çözüm, bağımsız değişkenleri öğesine geçirmektir, CreateDefaultBuilder bunun yerine ConfigurationBuilder metodun AddCommandLine yönteminin hem bağımsız değişkenleri hem de anahtar eşleme sözlüğünü işlemesini sağlar.

Ortam ve komut satırı bağımsız değişkenlerini Visual Studio ayarla

Aşağıdaki görüntüde, ortamı ve komut satırı bağımsız değişkenlerini Visual Studio olarak ayarlama gösterilmektedir:

VS 'nin hata ayıklama sekmesi

Visual Studio 2019 sürüm 16,10 preview 4 ve üzeri sürümlerde, başlatma profilleri kullanıcı arabiriminden ortam ve komut satırı bağımsız değişkenlerini ayarlama işlemi yapılır:

profil kullanıcı arabirimini Başlat

Hiyerarşik yapılandırma verileri

Yapılandırma API 'SI, hiyerarşik verileri, yapılandırma anahtarlarında bir sınırlayıcı kullanımıyla birlikte düzleştirerek hiyerarşik yapılandırma verilerini okur.

Örnek indirme aşağıdaki appsettings.json dosyayı içerir:

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

Örnek indirmenin aşağıdaki kodu, yapılandırma ayarlarından birkaçını görüntüler:

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}");
    }
}

Hiyerarşik yapılandırma verilerini okumak için tercih edilen yol, Seçenekler modelini kullanmaktır. Daha fazla bilgi için, bkz. bu belgedeki Hiyerarşik yapılandırma verilerini bağlama .

GetSection ve GetChildren yapılandırma verileri bölümünün bölümlerini ve alt öğelerini yalıtmak için kullanılabilir. Bu yöntemler daha sonra GetSection, GetChildren ve Existsiçinde açıklanmıştır.

Yapılandırma anahtarları ve değerleri

Yapılandırma anahtarları:

  • Büyük/küçük harfe duyarsızdır. Örneğin, ConnectionString ve connectionstring eşdeğer anahtarlar olarak değerlendirilir.
  • Bir anahtar ve değer birden fazla yapılandırma sağlayıcısından ayarlandıysa, eklenen son sağlayıcıdan alınan değer kullanılır. Daha fazla bilgi için bkz. varsayılan yapılandırma.
  • Hiyerarşik anahtarlar
    • Yapılandırma API 'SI içinde, iki nokta üst üste ayırıcı ( : ) tüm platformlarda çalışmaktadır.
    • Ortam değişkenlerinde, tüm platformlarda bir iki nokta ayırıcı çalışmayabilir. Çift alt çizgi, __ tüm platformlar tarafından desteklenir ve otomatik olarak iki nokta olarak dönüştürülür : .
    • Azure Key Vault, hiyerarşik anahtarlar -- ayırıcı olarak kullanılır. Gizli diziler uygulamanın yapılandırmasına yüklendiğinde Azure Key Vault yapılandırma sağlayıcısı otomatik olarak -- bir ile değiştirilir : .
  • , ConfigurationBinder Yapılandırma anahtarlarındaki dizi dizinlerini kullanarak nesnelere dizileri bağlamayı destekler. Dizi bağlama, diziyi bir sınıfa bağlama bölümünde açıklanmıştır.

Yapılandırma değerleri:

  • Dizeler.
  • Null değerler yapılandırmada saklanamaz veya nesnelere bağlanabilir.

Yapılandırma sağlayıcıları

aşağıdaki tabloda ASP.NET Core uygulamalar için kullanılabilen yapılandırma sağlayıcıları gösterilmektedir.

Sağlayıcı Şuradan yapılandırma sağlar
Azure Key Vault yapılandırma sağlayıcısı Azure Key Vault
Azure uygulama yapılandırma sağlayıcısı Azure Uygulama Yapılandırması
Komut satırı yapılandırma sağlayıcısı Komut satırı parametreleri
Özel yapılandırma sağlayıcısı Özel kaynak
Ortam değişkenleri yapılandırma sağlayıcısı Ortam değişkenleri
Dosya yapılandırma sağlayıcısı INı, JSON ve XML dosyaları
Dosya başına anahtar yapılandırma sağlayıcısı Dizin dosyaları
Bellek yapılandırma sağlayıcısı Bellek içi Koleksiyonlar
Kullanıcı gizli dizileri Kullanıcı profili dizinindeki dosya

Yapılandırma kaynakları, yapılandırma sağlayıcılarının belirtilme sırasına göre okundu. Koddaki yapılandırma sağlayıcılarını, uygulamanın gerektirdiği temel yapılandırma kaynakları için önceliklere uyacak şekilde sıralayın.

Yapılandırma sağlayıcılarının tipik bir sırası şunlardır:

  1. appsettings.json
  2. appSettings. Environment . JSON
  3. Kullanıcı gizli dizileri
  4. Ortam değişkenleri yapılandırma sağlayıcısınıkullanarak ortam değişkenleri.
  5. Komut satırı yapılandırma sağlayıcısınıkullanan komut satırı bağımsız değişkenleri.

Ortak bir uygulama, komut satırı bağımsız değişkenlerinin diğer sağlayıcılar tarafından ayarlanan yapılandırmayı geçersiz kılmasına izin vermek için komut satırı yapılandırma sağlayıcısını en son bir sağlayıcı dizisine eklemektir.

Önceki sağlayıcı dizisi Varsayılan yapılandırmadakullanılır.

Bağlantı dizesi önekleri

Yapılandırma API 'sinin dört bağlantı dizesi ortam değişkeni için özel işleme kuralları vardır. Bu bağlantı dizeleri, uygulama ortamı için Azure bağlantı dizelerini yapılandırmaya dahil edilir. Tabloda gösterilen öneklerle ortam değişkenleri, varsayılan yapılandırmayla veya uygulamasına hiçbir önek sağlanmadığında uygulamaya yüklenir AddEnvironmentVariables .

Bağlantı dizesi öneki Sağlayıcı
CUSTOMCONNSTR_ Özel sağlayıcı
MYSQLCONNSTR_ MySQL
SQLAZURECONNSTR_ Azure SQL Veritabanı
SQLCONNSTR_ SQL Server

Bir ortam değişkeni keşfedildiğinde ve tabloda gösterilen dört önekle yapılandırmaya yüklendiğinde:

  • Yapılandırma anahtarı, ortam değişkeni öneki kaldırılarak ve bir yapılandırma anahtarı bölümü () eklenerek oluşturulur ConnectionStrings .
  • Veritabanı bağlantı sağlayıcısını temsil eden yeni bir yapılandırma anahtar-değer çifti oluşturulur (için CUSTOMCONNSTR_ , belirtilen sağlayıcı olmayan).
Ortam değişkeni anahtarı Dönüştürülen yapılandırma anahtarı Sağlayıcı yapılandırma girişi
CUSTOMCONNSTR_{KEY} ConnectionStrings:{KEY} Yapılandırma girişi oluşturulmamış.
MYSQLCONNSTR_{KEY} ConnectionStrings:{KEY} Anahtar: ConnectionStrings:{KEY}_ProviderName :
Değer: MySql.Data.MySqlClient
SQLAZURECONNSTR_{KEY} ConnectionStrings:{KEY} Anahtar: ConnectionStrings:{KEY}_ProviderName :
Değer: System.Data.SqlClient
SQLCONNSTR_{KEY} ConnectionStrings:{KEY} Anahtar: ConnectionStrings:{KEY}_ProviderName :
Değer: System.Data.SqlClient

Dosya yapılandırma sağlayıcısı

FileConfigurationProvider , dosya sisteminden yapılandırma yüklemeye yönelik temel sınıftır. Aşağıdaki yapılandırma sağlayıcıları öğesinden türetilir FileConfigurationProvider :

INı yapılandırma sağlayıcısı

, IniConfigurationProvider Çalışma ZAMANıNDA INI dosyası anahtar-değer çiftlerinden yapılandırmayı yükler.

Aşağıdaki kod tüm yapılandırma sağlayıcılarını temizler ve çeşitli yapılandırma sağlayıcıları ekler:

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>();
            });
}

Yukarıdaki kodda, MyIniConfig.ini ve Myıniconfig içindeki Environment ayarlar. ını dosyaları, içindeki ayarlar tarafından geçersiz kılınır:

Örnek indirme , aşağıdaki MyIniConfig.ini dosyasını içerir:

MyKey="MyIniConfig.ini Value"

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

[Logging:LogLevel]
Default=Information
Microsoft=Warning

Örnek indirmenin aşağıdaki kodu, önceki yapılandırma ayarlarından birkaçını görüntüler:

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 yapılandırma sağlayıcısı

, JsonConfigurationProvider YAPıLANDıRMAYı JSON dosya anahtar-değer çiftleriyle yükler.

Aşırı yüklemeler şunları belirtebilir:

  • Dosyanın isteğe bağlı olup olmadığı.
  • Dosya değişirse yapılandırmanın yeniden yüklenip yüklenmediğini belirtir.

Aşağıdaki kodu inceleyin:

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>();
            });
}

Yukarıdaki kod:

Genellikle, ortam değişkenleri Yapılandırma sağlayıcısında ve komut satırı yapılandırma sağlayıcısındaayarlanmış özel bir JSON dosyası değerlerini geçersiz kılmayı istemezsiniz.

Aşağıdaki kod tüm yapılandırma sağlayıcılarını temizler ve çeşitli yapılandırma sağlayıcıları ekler:

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>();
            });
}

Yukarıdaki kodda, MyConfig. JSON ve MyConfig içindeki Environment ayarlar. JSON dosyaları:

Örnek indirme , şu MyConfig. JSON dosyasını içerir:

{
    "Position": {
        "Title": "Yapılandırma başım",
        "Name": "My Config Smith"
    },
    "MyKey": "MyConfig.json Value",
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

Örnek indirmenin aşağıdaki kodu, önceki yapılandırma ayarlarından birkaçını görüntüler:

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 yapılandırma sağlayıcısı

, XmlConfigurationProvider Çalışma ZAMANıNDA XML dosya anahtar-değer çiftlerinden yapılandırmayı yükler.

Aşağıdaki kod tüm yapılandırma sağlayıcılarını temizler ve çeşitli yapılandırma sağlayıcıları ekler:

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>();
            });
}

Yukarıdaki kodda, MyXMLFile.xml ve myXMLfile içindeki ayarlar. Environment .. XML dosyaları, içindeki ayarlar tarafından geçersiz kılınır:

Örnek indirme , aşağıdaki MyXMLFile.xml dosyasını içerir:

<?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>

Örnek indirmenin aşağıdaki kodu, önceki yapılandırma ayarlarından birkaçını görüntüler:

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}");
    }
}

Aynı öğe adını kullanan yinelenen öğeler, name özniteliği öğeleri ayırt etmek için kullanılacaksa çalışır:

<?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>

Aşağıdaki kod, önceki yapılandırma dosyasını okur ve anahtarları ve değerleri görüntüler:

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"
                       );
    }
}

Öznitelikler, değerler sağlamak için kullanılabilir:

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

Önceki yapılandırma dosyası aşağıdaki anahtarları ile yükler value :

  • anahtar: öznitelik
  • Section: Key: özniteliği

Dosya başına anahtar yapılandırma sağlayıcısı

, KeyPerFileConfigurationProvider Dizin dosyalarını yapılandırma anahtar-değer çiftleri olarak kullanır. Anahtar, dosya adıdır. Değer, dosyanın içeriğini içerir. Dosya başına anahtar yapılandırma sağlayıcısı Docker barındırma senaryolarında kullanılır.

Dosya başına anahtar yapılandırmasını etkinleştirmek için, AddKeyPerFile bir örneğinde genişletme yöntemini çağırın ConfigurationBuilder . directoryPathDosyaların mutlak bir yol olması gerekir.

Aşırı yüklemeler belirtmeye izin ver:

  • Action<KeyPerFileConfigurationSource>Kaynağı yapılandıran bir temsilci.
  • Dizinin isteğe bağlı olup olmadığını ve dizinin yolunu belirtir.

Çift alt çizgi ( __ ), dosya adlarında yapılandırma anahtarı sınırlayıcısı olarak kullanılır. Örneğin, dosya adı Logging__LogLevel__System yapılandırma anahtarını üretir Logging:LogLevel:System .

ConfigureAppConfigurationUygulamanın yapılandırmasını belirtmek için Konağı oluştururken çağırın:

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

Bellek yapılandırma sağlayıcısı

, MemoryConfigurationProvider Yapılandırma anahtar-değer çiftleri olarak bellek içi koleksiyon kullanır.

Aşağıdaki kod, yapılandırma sistemine bir bellek koleksiyonu ekler:

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>();
            });
    }
}

Örnek indirmenin aşağıdaki kodu, önceki yapılandırma ayarlarını görüntüler:

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}");
    }
}

Önceki kodda, config.AddInMemoryCollection(Dict) varsayılan yapılandırma sağlayıcılarındansonra eklenir. Yapılandırma sağlayıcılarını sipariş eden bir örnek için bkz. JSON yapılandırma sağlayıcısı.

Bkz. kullanarak bir diziyi başka bir örnek için bağlama MemoryConfigurationProvider .

Kestrel uç nokta yapılandırması

Kestrel belirli uç nokta yapılandırması tüm sunucular arası uç nokta yapılandırmalarını geçersiz kılar. Sunucular arası uç nokta yapılandırması şunları içerir:

bir ASP.NET Core web uygulamasında aşağıdaki dosyayı göz önünde bulundurun appsettings.json :

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

önceki vurgulanan biçimlendirme bir ASP.NET Core web uygulamasında kullanıldığında ve uygulama, komut satırında aşağıdaki çapraz sunucu uç noktası yapılandırmasıyla başlatıldığında:

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

KestrelKestrel, appsettings.json dosyasında () için özel olarak yapılandırılan bitiş noktasına bağlanır https://localhost:9999 https://localhost:7777 .

KestrelBir ortam değişkeni olarak yapılandırılmış belirli bir uç noktayı göz önünde bulundurun:

set Kestrel__Endpoints__Https__Url=https://localhost:8888

Önceki ortam değişkeninde, Https Kestrel belirli uç noktanın adıdır. Yukarıdaki appsettings.json Dosya Ayrıca Kestrel adlı belirli bir uç noktayı tanımlar Https . Varsayılanolarak, ortam değişkenleri yapılandırma sağlayıcısını kullanan ortam değişkenleri appSettings 'ten sonra okunurdur . Environment Bu nedenle, önceki ortam değişkeni Https uç nokta için kullanılır.

GetValue

ConfigurationBinder.GetValue<T> belirtilen anahtarla yapılandırmadan tek bir değeri ayıklar ve belirtilen türe dönüştürür:

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}");
    }
}

Yukarıdaki kodda, NumberKey yapılandırmada bulunamasa varsayılan değeri 99 kullanılır.

GetSection, GetChildren ve Exists

Aşağıdaki örnekler için aşağıdaki MySubsection.json dosyasını göz önünde bulundurabilirsiniz:

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

Aşağıdaki kod, yapılandırma sağlayıcılarına MySubsection.json ekler:

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.GetSection, belirtilen alt bölüm anahtarına sahip bir yapılandırma alt bölüm döndürür.

Aşağıdaki kod için değerleri section1 döndürür:

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"]}'");
    }
}

Aşağıdaki kod için değerleri section2:subsection0 döndürür:

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 hiçbir zaman null döndürür. Eşleşen bir bölüm bulunamasa boş IConfigurationSection bir döndürülür.

GetSectionEşleşen bir bölüm Value döndürduğunda doldurulmaz. bölümü Key Path mevcut olduğunda ve döndürülür.

GetChildren ve Exists

Aşağıdaki kod IConfiguration.GetChildren'ı çağırarak için değerler section2:subsection0 döndürür:

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);
    }
}

Yukarıdaki kod ConfigurationExtensions.Exists'i çağırarak bölümün mevcut olduğunu doğrular:

Dizi bağlama

ConfigurationBinder.Bind, yapılandırma anahtarlarında dizi dizinlerini kullanarak dizileri nesnelere bağlamayı destekler. Sayısal anahtar kesimini ortaya çıkaran herhangi bir dizi biçimi, bir POCO sınıf dizisine dizi bağlama özelliğine sahip olur.

Örnek indirmeden MyArray.json'u düşünün:

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

Aşağıdaki kod, yapılandırma sağlayıcılarına MyArray.json ekler:

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>();
            });
}

Aşağıdaki kod yapılandırmayı okur ve değerleri görüntüler:

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);
    }
}

Yukarıdaki kod aşağıdaki çıkışı döndürür:

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

Yukarıdaki çıkışta Dizin 3, value40 "4": "value40", MyArray.json içinde değerine karşılık gelir. Bağlı dizi dizinleri süreklidir ve yapılandırma anahtarı dizinine bağlı değildir. Yapılandırma bağlayıcısı, null değerleri bağlama veya bağlı nesnelerde null girişler oluşturma özelliğine sahip değildir

Aşağıdaki kod uzantı array:entries yöntemiyle AddInMemoryCollection yapılandırmayı yükler:

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>();
            });
    }
}

Aşağıdaki kod, içinde yapılandırmayı okur arrayDict Dictionary ve değerleri görüntüler:

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);
    }
}

Yukarıdaki kod aşağıdaki çıkışı döndürür:

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

Bağlı # nesnede Dizin 3, yapılandırma anahtarı için yapılandırma array:4 verilerini ve değerini value4 tutar. Bir dizi içeren yapılandırma verileri bağlı olduğunda, yapılandırma anahtarlarında dizi dizinleri, nesneyi oluştururken yapılandırma verilerini yeniden oluşturmak için kullanılır. Yapılandırma verilerde null değer korunamaz ve yapılandırma anahtarlarında bir dizi bir veya daha fazla dizin atlasa, bağlı bir nesnede null değerli bir giriş oluşturulmaz.

Dizin 3 için eksik yapılandırma öğesi, dizin 3 anahtar/değer çiftini okuyabilen herhangi bir yapılandırma sağlayıcısı tarafından örneğine # ArrayExample # bağlamadan önce sağlanmalıdır. Örnek indirmeden aşağıdaki Value3.json dosyasını göz önünde bulundurabilirsiniz:

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

Aşağıdaki kod, Value3.json ve için yapılandırmayı arrayDict Dictionary içerir:

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>();
            });
    }
}

Aşağıdaki kod önceki yapılandırmayı okur ve değerleri görüntüler:

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);
    }
}

Yukarıdaki kod aşağıdaki çıkışı döndürür:

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

Dizi bağlaması uygulamak için özel yapılandırma sağlayıcıları gerekmez.

Özel yapılandırma sağlayıcısı

Örnek uygulama, Entity Framework (EF) kullanarak bir veritabanından yapılandırma anahtar-değer çiftlerini okumayan temel bir yapılandırma sağlayıcısı oluşturmayı gösterir.

Sağlayıcı aşağıdaki özelliklere sahiptir:

  • Bellek içinde EF veritabanı tanıtım amacıyla kullanılır. Bağlantı dizesi gerektiren bir veritabanını kullanmak için, başka bir yapılandırma sağlayıcısından bağlantı ConfigurationBuilder dizesini sağlamak üzere ikincil bir uygulama gerçekleştirin.
  • Sağlayıcı, başlangıçta yapılandırma için bir veritabanı tablosu okur. Sağlayıcı, veritabanını anahtar başına sorgulamaz.
  • Yeniden yükleme-on-change uygulanmaz, bu nedenle uygulama başladıktan sonra veritabanını güncelleştirmek uygulamanın yapılandırması üzerinde hiçbir etkisi olmaz.

Yapılandırma EFConfigurationValue değerlerini veritabanında depolamak için bir varlık tanımlayın.

Models/EFConfigurationValue.cs:

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

Yapılandırılmış değerleri EFConfigurationContext depolamak ve bu değerlere erişmek için bir ekleyin.

EFConfigurationProvider/EFConfigurationContext.cs:

// using Microsoft.EntityFrameworkCore;

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

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

uygulayan bir sınıf IConfigurationSource oluşturun.

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);
    }
}

'den devralarak özel yapılandırma sağlayıcısını ConfigurationProvider oluşturun. Yapılandırma sağlayıcısı, boş olduğunda veritabanını başlatıyor. Yapılandırma anahtarları büyük/küçük harfe duyarlı olmadığından, veritabanını başlatmak için kullanılan sözlük büyük/küçük harfe duyarlı olmayan karşılayıcı (StringComparer.OrdinalIgnoreCase) ile oluşturulur.

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;
    }
}

Uzantı AddEFConfiguration yöntemi, yapılandırma kaynağının bir 'a eksn eklemeye izin ConfigurationBuilder vermemektedir.

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));
    }
}

Aşağıdaki kod, Özel'in EFConfigurationProvider Program.cs içinde nasıl kullanılalı olduğunu gösterir:

// using Microsoft.EntityFrameworkCore;

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

Başlangıç'ta erişim yapılandırması

Aşağıdaki kod, yapılandırma verilerini Startup yöntemlerde görüntüler:

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();
        });
    }
}

Başlangıç kolaylık yöntemlerini kullanarak yapılandırmaya erişme örneği için bkz. Uygulama başlatma: Kolaylık yöntemleri.

Sayfalarda erişim Razor yapılandırması

Aşağıdaki kod, yapılandırma verilerini bir Sayfada Razor görüntüler:

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

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

Aşağıdaki kodda, MyOptions ile hizmet kapsayıcısı eklenir ve Configure yapılandırmaya bağlıdır:

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

    services.AddRazorPages();
}

Aşağıdaki işaretleme, seçenek @inject Razor değerlerini çözümlemek ve görüntülemek için yönergesini kullanır:

@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 görünüm dosyasındaki yapılandırmaya erişme

Aşağıdaki kod bir MVC görünümünde yapılandırma verilerini görüntüler:

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

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

Temsilci ile seçenekleri yapılandırma

Yapılandırma sağlayıcılarında ayarlanmış temsilci geçersiz kılma değerlerde yapılandırılan seçenekler.

Bir temsilciyle seçeneklerin yapılandırılması, örnek uygulamada Örnek 2 olarak gösterildi.

Aşağıdaki kodda, IConfigureOptions<TOptions> hizmet kapsayıcısı için bir hizmet eklenir. için değerleri yapılandırmak üzere bir temsilci MyOptions kullanır:

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

    services.AddRazorPages();
}

Aşağıdaki kodda seçenekler değerleri görüntülenir:

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}");
    }
}

Yukarıdaki örnekte, ve değerleri içinde Option1 Option2 belirtilir ve ardından appsettings.json yapılandırılan temsilci tarafından geçersiz kılınır.

Konak ve uygulama yapılandırması karşılaştırması

Uygulama yapılandırılmadan ve başlamadan önce bir konak yapılandırılır ve başlatıldığında. Konak, uygulama başlatma ve yaşam süresi yönetiminden sorumludur. Hem uygulama hem de konak, bu konuda açıklanan yapılandırma sağlayıcıları kullanılarak yapılandırılır. Konak yapılandırma anahtar-değer çiftleri de uygulamanın yapılandırmasına dahil edilir. Konak yapılandırmasını yapılandırma sağlayıcılarının nasıl kullandığı ve yapılandırma kaynaklarının konak yapılandırmasını nasıl etkilediği hakkında daha fazla bilgi için ASP.NET Core temelleri bkz. .

Varsayılan konak yapılandırması

Web Ana Bilgisayarı kullanırken varsayılan yapılandırmayla ilgili ayrıntılar içinbu konunun ASP.NET Core 2.2 sürümüne bakın.

  • Konak yapılandırması şu şekilde sağlanır:
    • Ortam Değişkenleri yapılandırma sağlayıcısı kullanılarak ön ekli ortam değişkenleri DOTNET_ DOTNET_ENVIRONMENT (örneğin,). Yapılandırma DOTNET_ anahtar-değer çiftleri yüklendiğinde ön ek ( ) çıkarılmış olur.
    • Komut satırı yapılandırma sağlayıcısını kullanan komut satırı bağımsız değişkenleri.
  • Web Ana Bilgisayarı varsayılan yapılandırması kurulur ( ConfigureWebHostDefaults ):
    • Kestrel web sunucusu olarak kullanılır ve uygulamanın yapılandırma sağlayıcıları kullanılarak yapılandırılır.
    • Konak Filtreleme Ara Yazılımı ekleme.
    • Ortam değişkeni olarak ayarlanmışsa, ASPNETCORE_FORWARDEDHEADERS_ENABLED iletili Üst Bilgiler Ara Yazılımı true ekleyin.
    • IIS tümleştirmeyi etkinleştirin.

Diğer yapılandırma

Bu konu yalnızca uygulama yapılandırmasıyla ilgilidir. Uygulamaları çalıştırmanın ve barındırmanın ASP.NET Core yönleri, bu konu başlığı altında yer alan yapılandırma dosyaları kullanılarak yapılandırılır:

launchSettings.json içinde ayarlanmış ortam değişkenleri, sistem ortamındaki bu ayarları geçersiz kılar.

ASP.NET 'ın önceki sürümlerinden uygulama yapılandırmasını geçirme hakkında daha fazla bilgi için bkz ASP.NET'den ASP.NET Core ..

Bir dış derlemeden yapılandırma Ekle

Uygulama IHostingStartup , uygulamanın sınıfı dışında bir dış derlemeden başlatma sırasında bir uygulamaya iyileştirmeler eklenmesine olanak sağlar Startup . Daha fazla bilgi için bkz. ASP.NET Core 'de barındırma başlangıç derlemelerini kullanın.

Ek kaynaklar