.Net çekirdeğinde appsettings.json'dan değer alma


162

Burada ne eksik emin değilim ama benim appnettings.json benim .net çekirdek uygulamasında değerleri alamıyorum. Benim appsettings.json var:

{
    "AppSettings": {
        "Version": "One"
    }
}

Başlamak:

public class Startup
{
    private IConfigurationRoot _configuration;
    public Startup(IHostingEnvironment env)
    {
        _configuration = new ConfigurationBuilder()
    }
    public void ConfigureServices(IServiceCollection services)
    {
      //Here I setup to read appsettings        
      services.Configure<AppSettings>(_configuration.GetSection("AppSettings"));
    }
}

Model:

public class AppSettings
{
    public string Version{ get; set; }
}

Denetleyici:

public class HomeController : Controller
{
    private readonly AppSettings _mySettings;

    public HomeController(IOptions<AppSettings> settings)
    {
        //This is always null
        _mySettings = settings.Value;
    }
}

_mySettingsher zaman sıfırdır. Burada özlediğim bir şey var mı?


3
Lütfen yapılandırmanın nasıl kullanılacağına ilişkin belgeleri okuyun . Başlangıç ​​sınıfınızdaki yapılandırmayı yanlış ayarladınız.
dürtmek

Dokümantasyon için teşekkürler. Bu yardımcı oldu.
aman

bu sadece IConfiguration'ın bağımlılık enjeksiyonu kullanılarak basitleştirilebilir. Burada açıklanmıştır coding-issues.com/2018/10/…
Ranadheer Reddy

Yanıtlar:


229

Program ve Başlangıç ​​sınıfı

.NET Core 2.x

Yeni gerekmez IConfigurationiçinde Startupyapıcısı. Uygulanması DI sistemi tarafından enjekte edilecektir.

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();            
}

// Startup.cs
public class Startup
{
    public IHostingEnvironment HostingEnvironment { get; private set; }
    public IConfiguration Configuration { get; private set; }

    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        this.HostingEnvironment = env;
        this.Configuration = configuration;
    }
}

.NET Çekirdek 1.x

StartupAppsettings dosyalarını yüklemenizi söylemelisiniz .

// Program.cs
public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();

        host.Run();
    }
}

//Startup.cs
public class Startup
{
    public IConfigurationRoot Configuration { get; private set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        this.Configuration = builder.Build();
    }
    ...
}

Değerleri Alma

Uygulama ayarlarından yapılandırdığınız değeri elde etmenin birçok yolu vardır:

  • Kullanmanın basit yolu ConfigurationBuilder.GetValue<T>
  • Seçenek Desenini Kullanma

Diyelim ki appsettings.jsongörünüşünüz şöyle:

{
    "ConnectionStrings": {
        ...
    },
    "AppIdentitySettings": {
        "User": {
            "RequireUniqueEmail": true
        },
        "Password": {
            "RequiredLength": 6,
            "RequireLowercase": true,
            "RequireUppercase": true,
            "RequireDigit": true,
            "RequireNonAlphanumeric": true
        },
        "Lockout": {
            "AllowedForNewUsers": true,
            "DefaultLockoutTimeSpanInMins": 30,
            "MaxFailedAccessAttempts": 5
        }
    },
    "Recaptcha": { 
        ...
    },
    ...
}

Basit yol

Tüm yapılandırmayı denetleyici / sınıfınızın yapıcısına (yoluyla IConfiguration) enjekte edebilir ve belirtilen bir anahtarla istediğiniz değeri alabilirsiniz:

public class AccountController : Controller
{
    private readonly IConfiguration _config;

    public AccountController(IConfiguration config)
    {
        _config = config;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _config.GetValue<int>(
                "AppIdentitySettings:Password:RequiredLength"),
            RequireUppercase = _config.GetValue<bool>(
                "AppIdentitySettings:Password:RequireUppercase")
        };

        return View(vm);
    }
}

Seçenekler Desen

ConfigurationBuilder.GetValue<T>Sadece uygulama ayarlarından bir ya da iki değeri gerekiyorsa iyi çalışıyor. Ancak uygulama ayarlarından birden fazla değer almak istiyorsanız veya bu anahtar dizeleri birden çok yerde sabit olarak kodlamak istemiyorsanız, Seçenekler Kalıbı'nı kullanmak daha kolay olabilir . Seçenek deseni, hiyerarşiyi / yapıyı temsil etmek için sınıfları kullanır.

Seçenek desenini kullanmak için:

  1. Yapıyı temsil edecek sınıfları tanımlama
  2. Bu sınıfların bağlandığı yapılandırma örneğini kaydedin
  3. Değer IOptions<T>almak istediğiniz denetleyicinin / sınıfın yapıcısına enjekte edin

1. Yapıyı temsil edecek yapılandırma sınıflarını tanımlayın

Tam olarak eşleşmesi gereken özelliklere sahip sınıflar tanımlayabilirsinizUygulama ayarlarınızdaki anahtarlarla . Sınıfın adının uygulama ayarlarındaki bölümün adıyla eşleşmesi gerekmez:

public class AppIdentitySettings
{
    public UserSettings User { get; set; }
    public PasswordSettings Password { get; set; }
    public LockoutSettings Lockout { get; set; }
}

public class UserSettings
{
    public bool RequireUniqueEmail { get; set; }
}

public class PasswordSettings
{
    public int RequiredLength { get; set; }
    public bool RequireLowercase { get; set; }
    public bool RequireUppercase { get; set; }
    public bool RequireDigit { get; set; }
    public bool RequireNonAlphanumeric { get; set; }
}

public class LockoutSettings
{
    public bool AllowedForNewUsers { get; set; }
    public int DefaultLockoutTimeSpanInMins { get; set; }
    public int MaxFailedAccessAttempts { get; set; }
}

2. Yapılandırma örneğini kaydedin

Ve sonra bu yapılandırma örneğini ConfigureServices()başlangıçta kaydetmeniz gerekir :

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
...

namespace DL.SO.UI.Web
{
    public class Startup
    {
        ...
        public void ConfigureServices(IServiceCollection services)
        {
            ...
            var identitySettingsSection = 
                _configuration.GetSection("AppIdentitySettings");
            services.Configure<AppIdentitySettings>(identitySettingsSection);
            ...
        }
        ...
    }
}

3. IOptions enjekte edin

Son olarak, değerleri almak istediğiniz denetleyici / sınıfta, IOptions<AppIdentitySettings>yapıcı aracılığıyla enjekte etmeniz gerekir :

public class AccountController : Controller
{
    private readonly AppIdentitySettings _appIdentitySettings;

    public AccountController(IOptions<AppIdentitySettings> appIdentitySettingsAccessor)
    {
        _appIdentitySettings = appIdentitySettingsAccessor.Value;
    }

    [AllowAnonymous]
    public IActionResult ResetPassword(int userId, string code)
    {
        var vm = new ResetPasswordViewModel
        {
            PasswordRequiredLength = _appIdentitySettings.Password.RequiredLength,
            RequireUppercase = _appIdentitySettings.Password.RequireUppercase
        };

        return View(vm);
    }
}

Verilerimi içeren Sınıftaki Değerlere nasıl erişebilirim?
Lukas Hieronimus Adler

1
@LukasHieronimusAdler: Bunun IOptionsSnapshot<T>yerine kullanmak isteyebilirsiniz IOptions<T>. Bu makaleye göz atabilirsiniz: offer.solutions/blog/articles/2017/02/17/… . Yine de kendim deneme şansım olmadı.
David Liang

2
Parçacık gibi basitleştirebilir misiniz?
Syaiful Nizam Yahya

8
Tam yığından geriye ne korkunç bir adım .net
Aaron

4
Tamam, .NET Core 3 için Microsoft.Extensions.Options.ConfigurationExtensions paketine ihtiyacınız var ve iyi çalışıyor
Tomas Bruckner

50

Bir AnyName.cs dosyası oluşturun ve aşağıdaki kodu yapıştırın.

using System;
using System.IO;
using Microsoft.Extensions.Configuration;

namespace Custom
{
    static class ConfigurationManager
    {
        public static IConfiguration AppSetting { get; }
        static ConfigurationManager()
        {
            AppSetting = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("YouAppSettingFile.json")
                    .Build();
        }
    }
}

YouAppSettingFile.json dosya adınızı dosya adınızla değiştirmelidir.
.Json dosyanız aşağıdaki gibi görünmelidir.

{
    "GrandParent_Key" : {
        "Parent_Key" : {
            "Child_Key" : "value1"
        }
    },
    "Parent_Key" : {
        "Child_Key" : "value2"
    },
    "Child_Key" : "value3"
}

Şimdi kullanabilirsiniz. Sınıfınızda kullanmak istediğiniz yere Referans Ekle'yi
unutmayın .

using Custom;

Değer almak için kod.

string value1 = ConfigurationManager.AppSetting["GrandParent_Key:Parent_Key:Child_Key"];
string value2 = ConfigurationManager.AppSetting["Parent_Key:Child_Key"];
string value3 = ConfigurationManager.AppSetting["Child_Key"];

3
Bunu üretimde kullanmayın. Bu yaklaşım, web API'mızda bellek sızıntılarına neden olan şeydi. Netcore kullanıyorsanız, IConfiguration'ı tam anlamıyla herhangi bir yere enjekte edebilirsiniz, sadece yukarıdaki yanıtlara bakın.
André Mantas

49

David Liang'ın Core 2.0 cevabına ekleme -

appsettings.jsondosya ASPNETCORE_ENVIRONMENTdeğişkene bağlıdır .

ASPNETCORE_ENVIRONMENTiçin herhangi bir değere ayarlanabilir, ancak üç değerleri desteklenir çerçeve ile: Development, Stagingve Production. Eğer ASPNETCORE_ENVIRONMENTayarlı değil, bu varsayılan değer olur Production.

Bu üç değer için bu appsettings.ASPNETCORE_ENVIRONMENT.json dosyaları kutunun dışında desteklenir - appsettings.Staging.json, appsettings.Development.jsonveappsettings.Production.json

Yukarıdaki üç uygulama ayarı json dosyası birden fazla ortamı yapılandırmak için kullanılabilir.

Misal - appsettings.Staging.json

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "MyConfig": "My Config Value for staging."
}

Configuration["config_var"]Herhangi bir yapılandırma değerini almak için kullanın .

public class Startup
{
    public Startup(IHostingEnvironment env, IConfiguration config)
    {
        Environment = env;
        Configuration = config;
        var myconfig = Configuration["MyConfig"];
    }

    public IConfiguration Configuration { get; }
    public IHostingEnvironment Environment { get; }
}

1
İç içe nesneler ne olacak?
Arthur Attout

8
İç içe nesneler Yapılandırma ile alınabilir ["MyConfig: SomethingNested"]
WeHaveCookies

1
Dosyada görülebileceği gibi 167 ASP.NET Core satırındaki github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/… dosyasında şu anda appsettings.json+ yükleniyorappsettings.{env.EnvironmentName}.json . Bu nedenle ASP.NET Core'un yalnızca Geliştirme, Hazırlama ve Üretim appsettings.json dosyalarını yüklediği bildirimi şu anda yanlıştır.
mvdgun

1
bu yüzden ASPNETCORE_ENVIRONMENTher seferinde Windows değişkenini ayarlamam gerekiyor mu? Net 4'te işler çok daha kolaydı. Bu JSON fanatikleri büyük zaman
Toolkit

@Toolkit Ortam değişkenini global olarak ayarlayabilirsiniz. docs.microsoft.com/tr-tr/aspnet/core/fundamentals/…
Aseem Gautam

29

Sanırım en basit yolu DI. Denetleyiciye ulaşma örneği.

// StartUp.cs
public void ConfigureServices(IServiceCollection services)
{
    ...
    // for get appsettings from anywhere
    services.AddSingleton(Configuration);
}

public class ContactUsController : Controller
{
    readonly IConfiguration _configuration;

    public ContactUsController(
        IConfiguration configuration)
    {
        _configuration = configuration;

        // sample:
        var apiKey = _configuration.GetValue<string>("SendGrid:CAAO");
        ...
    }
}

5
Diğer cevapları okurken, bu en iyisi olmalı.
harveyt

Kayboldum services.AddSingleton(Configuration);, şimdi işe yarıyor
Arthur Medeiros

12

Başlangıç ​​sınıfının yapıcısında, enjekte edilen IConfiguration nesnesini kullanarak appsettings.json ve diğer birçok ayara erişebilirsiniz:

Startup.cs Yapıcı

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;

        //here you go
        var myvalue = Configuration["Grandfather:Father:Child"];

    }

public IConfiguration Configuration { get; }

Appsettings.json içeriği

  {
  "Grandfather": {
    "Father": {
      "Child": "myvalue"
    }
  }

2
Bana yardımcı olan 'Yapılandırma ["Büyükbaba: Baba: Çocuk"]' sözdizimiydi.
Jacques Olivier

2
Bu, yapılandırılmış, açık ve bu noktaya kadar olağanüstü bir cevaptır. Harika iletişim
jolySoft

6
    public static void GetSection()
    {
        Configuration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json")
            .Build();

        string BConfig = Configuration.GetSection("ConnectionStrings")["BConnection"];

    }

4
Eksik cevap
Carlos ABS

1

Benim durumumda, Configuration nesnesindeki Bind () yöntemini kullanmak basitti. Ve sonra nesneyi DI'ye singleton olarak ekleyin.

var instructionSettings = new InstructionSettings();
Configuration.Bind("InstructionSettings", instructionSettings);
services.AddSingleton(typeof(IInstructionSettings), (serviceProvider) => instructionSettings);

Talimat nesnesi istediğiniz kadar karmaşık olabilir.

{  
 "InstructionSettings": {
    "Header": "uat_TEST",
    "SVSCode": "FICA",
    "CallBackUrl": "https://UATEnviro.companyName.co.za/suite/webapi/receiveCallback",
    "Username": "s_integrat",
    "Password": "X@nkmail6",
    "Defaults": {
    "Language": "ENG",
    "ContactDetails":{
       "StreetNumber": "9",
       "StreetName": "Nano Drive",
       "City": "Johannesburg",
       "Suburb": "Sandton",
       "Province": "Gauteng",
       "PostCode": "2196",
       "Email": "ourDefaultEmail@companyName.co.za",
       "CellNumber": "0833 468 378",
       "HomeNumber": "0833 468 378",
      }
      "CountryOfBirth": "710"
    }
  }

1

ASP.NET Core 3.1 için bu kılavuzu takip edebilirsiniz:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

Yeni bir ASP.NET Core 3.1 projesi oluşturduğunuzda, aşağıdaki yapılandırma satırına sahip olursunuz Program.cs:

Host.CreateDefaultBuilder(args)

Bu aşağıdakileri mümkün kılar:

  1. ChainedConfigurationProvider: Varolan bir IConfiguration'ı kaynak olarak ekler. Varsayılan yapılandırma durumunda, ana makine yapılandırmasını ekler ve bunu uygulama yapılandırmasının ilk kaynağı olarak ayarlar.
  2. JSON yapılandırma sağlayıcısını kullanarak appsettings.json.
  3. appsettings.Environment.json, JSON yapılandırma sağlayıcısını kullanarak. Örneğin, appsettings.Production.json ve appsettings.Development.json.
  4. Uygulama Geliştirme ortamında çalıştığında uygulama sırları.
  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ı kullanarak komut satırı bağımsız değişkenleri.

Bu, IConfigurationdeğerleri bir dize anahtarıyla, hatta iç içe değerlerle enjekte edebileceğiniz ve getirebileceğiniz anlamına gelir . SevmekIConfiguration["Parent:Child"];

Misal:

appsettings.json

{
  "ApplicationInsights":
    {
        "Instrumentationkey":"putrealikeyhere"
    }
}

WeatherForecast.cs

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;
    private readonly IConfiguration _configuration;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var key = _configuration["ApplicationInsights:InstrumentationKey"];

        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

IConfiguration["Parent:Child"]Sözdizimi hakkında nereden daha fazla bilgi edinebilirim ?
xr280xr

0

Bence en iyi seçenek:

  1. Yapılandırma şeması olarak bir model sınıfı oluşturma

  2. DI'ye kaydolun: services.Configure (Configuration.GetSection ("democonfig"));

  3. Kontrol cihazınızdaki DI'den değerleri model nesnesi olarak alın:

    private readonly your_model myConfig;
    public DemoController(IOptions<your_model> configOps)
    {
        this.myConfig = configOps.Value;
    }

0

Asp.net core 2.2'den yukarısına aşağıdaki gibi kod yazabilirsiniz:

Adım 1. Bir AppSettings sınıf dosyası oluşturun.

Bu dosya, appsettings.json dosyasından anahtardan değer elde etmenize yardımcı olacak bazı yöntemler içerir. Aşağıdaki kod gibi görünün:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ReadConfig.Bsl
{
  public class AppSettings
  {
      private static AppSettings _instance;
      private static readonly object ObjLocked = new object();
      private IConfiguration _configuration;

      protected AppSettings()
      {
      }

      public void SetConfiguration(IConfiguration configuration)
      {
          _configuration = configuration;
      }

      public static AppSettings Instance
      {
          get
          {
              if (null == _instance)
              {
                  lock (ObjLocked)
                  {
                      if (null == _instance)
                          _instance = new AppSettings();
                  }
              }
              return _instance;
          }
      }

      public string GetConnection(string key, string defaultValue = "")
      {
          try
          {
              return _configuration.GetConnectionString(key);
          }
          catch
          {
              return defaultValue;
          }
      }

      public T Get<T>(string key = null)
      {
          if (string.IsNullOrWhiteSpace(key))
              return _configuration.Get<T>();
          else
              return _configuration.GetSection(key).Get<T>();
      }

      public T Get<T>(string key, T defaultValue)
      {
          if (_configuration.GetSection(key) == null)
              return defaultValue;

          if (string.IsNullOrWhiteSpace(key))
              return _configuration.Get<T>();
          else
              return _configuration.GetSection(key).Get<T>();
      }

      public static T GetObject<T>(string key = null)
      {
          if (string.IsNullOrWhiteSpace(key))
              return Instance._configuration.Get<T>();
          else
          {
              var section = Instance._configuration.GetSection(key);
              return section.Get<T>();
          }
      }

      public static T GetObject<T>(string key, T defaultValue)
      {
          if (Instance._configuration.GetSection(key) == null)
              return defaultValue;

          if (string.IsNullOrWhiteSpace(key))
              return Instance._configuration.Get<T>();
          else
              return Instance._configuration.GetSection(key).Get<T>();
      }
  }
}

Adım 2. AppSettings nesnesi için ilk yapılandırma

Uygulama başladığında appsettings.json dosyasını bildirip yüklememiz ve AppSettings nesnesi için yapılandırma bilgilerini yüklememiz gerekiyor. Bu işi Startup.cs dosyasının yapıcısında yapacağız. Lütfen satıra dikkat edinAppSettings.Instance.SetConfiguration(Configuration);

public Startup(IHostingEnvironment evm)
{
    var builder = new ConfigurationBuilder()
      .SetBasePath(evm.ContentRootPath)
      .AddJsonFile("appsettings.json", true, true)
      .AddJsonFile($"appsettings.{evm.EnvironmentName}.json", true)
      .AddEnvironmentVariables();
    Configuration = builder.Build(); // load all file config to Configuration property 
    AppSettings.Instance.SetConfiguration(Configuration);       
}

Tamam, şimdi aşağıdaki gibi bazı tuşları olan bir appsettings.json dosyası var:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "ConnectionString": "Data Source=localhost;Initial Catalog=ReadConfig;Persist Security Info=True;User ID=sa;Password=12345;"
  },
  "MailConfig": {
    "Servers": {
      "MailGun": {
        "Pass": "65-1B-C9-B9-27-00",
        "Port": "587",
        "Host": "smtp.gmail.com"
      }
    },
    "Sender": {
      "Email": "example@gmail.com",
      "Pass": "123456"
    }
  }
}

Adım 3. Bir eylemden yapılandırma değerini okuyun

Demoyu Ev denetleyicisinde aşağıdaki gibi bir işlem yapıyorum:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var connectionString = AppSettings.Instance.GetConnection("ConnectionString");
        var emailSender = AppSettings.Instance.Get<string>("MailConfig:Sender:Email");
        var emailHost = AppSettings.Instance.Get<string>("MailConfig:Servers:MailGun:Host");

        string returnText = " 1. Connection String \n";
        returnText += "  " +connectionString;
        returnText += "\n 2. Email info";
        returnText += "\n Sender : " + emailSender;
        returnText += "\n Host : " + emailHost;

        return Content(returnText);
    }
}

Ve sonuç aşağıda:

Sonucu görmek için tıklayın

Daha fazla bilgi için, daha ayrıntılı kod için asp.net çekirdeğinde appsettings.json'dan makale alma değerini inceleyebilirsiniz .


0

Çok basit: Appsettings.json içinde

  "MyValues": {
    "Value1": "Xyz"
  }

.Cs dosyasında:

static IConfiguration conf = (new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build());
        public static string myValue1= conf["MyValues:Value1"].ToString();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.