Отримання значення з appsettings.json в ядрі .net


162

Не впевнений, чого мені тут не вистачає, але я не в змозі отримати значення з мого appsettings.json в моєму додатку .net core. У мене є appsettings.json як:

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

Стартап:

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

Модель:

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

Контролер:

public class HomeController : Controller
{
    private readonly AppSettings _mySettings;

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

_mySettingsзавжди недійсний. Чи є щось, чого мені тут не вистачає?


3
Будь ласка , прочитайте документацію про те , як використовувати конфігурацію. Ви неправильно налаштували конфігурацію у вашому класі запуску.
ткнути

Дякуємо за документацію. Це було корисно.
аман

це можна навіть спростити, лише використовуючи введення залежності IConfiguration. Що пояснюється тут coding-isissue.com/2018/10/…
Ranadheer Reddy

Відповіді:


229

Програма та клас запуску

.NET Core 2.x

Вам не потрібно нового IConfigurationв Startupконструкторі. Його реалізація здійснюватиметься за допомогою системи DI.

// 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 Core 1.x

Вам потрібно сказати, Startupщоб завантажити файли програм.

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

Отримання цінностей

Є багато способів отримати налаштоване значення з налаштувань програми:

Скажімо, ваш appsettings.jsonвигляд виглядає так:

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

Простий спосіб

Ви можете ввести всю конфігурацію в конструктор вашого контролера / класу (через IConfiguration) та отримати потрібне значення за допомогою вказаного ключа:

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

Параметри шаблону

Чудово ConfigurationBuilder.GetValue<T>працює, якщо вам потрібно лише одне або два значення в налаштуваннях програми. Але якщо ви хочете отримати декілька значень із налаштувань програми, або ви не хочете жорстко кодувати ці ключові рядки в декількох місцях, можливо, буде простіше використовувати параметри шаблону . Шаблон параметрів використовує класи для представлення ієрархії / структури.

Щоб використовувати шаблон параметрів:

  1. Визначте класи для представлення структури
  2. Зареєструйте екземпляр конфігурації, до якого ці класи пов'язують
  3. Введіть IOptions<T>у конструктор контролера / класу, на який потрібно отримати значення

1. Визначте класи конфігурації для представлення структури

Ви можете визначити класи з властивостями, які повинні точно відповідати клавішам у налаштуваннях програми. Ім'я класу не повинно відповідати назві розділу в налаштуваннях програми:

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. Зареєструйте примірник конфігурації

Потім потрібно зареєструвати цей екземпляр конфігурації в ConfigureServices()для запуску:

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

Нарешті, на контролері / класі, який ви хочете отримати значення, вам потрібно ввести IOptions<AppIdentitySettings>через конструктор:

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

Як я можу отримати доступ до значень у класі, в якому зберігаються мої дані?
Лукас Ієронімус Адлер

1
@LukasHieronimusAdler: Ви можете використовувати IOptionsSnapshot<T>замість IOptions<T>. Ви можете подивитися на цю статтю: offering.solutions/blog/articles/2017/02/17 / ... . Я не мав жодного шансу спробувати це сам.
Девід Лян

2
Не могли б ви зробити це просто, як фрагмент?
Syaiful Nizam Yahya

8
Який жахливий крок назад від повного стека .net
Аарон

4
Гаразд, для .NET Core 3 вам потрібен пакет Microsoft.Extensions.Options.ConfigurationExtensions, і він працює добре
Tomas Bruckner

50

Просто створіть файл AnyName.cs і вставте наступний код.

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 на ім'я файлу.
Ваш файл .json має виглядати нижче.

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

Тепер ви можете ним скористатися.
Не забудьте додати довідку у своєму класі, де ви хочете використовувати.

using Custom;

Код для отримання значення.

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
Не використовуйте це у виробництві. Цей підхід став причиною протікання пам’яті в нашому веб-програмі. Якщо ви використовуєте netcore, ви можете ввести IConfiguration буквально де завгодно, просто подивіться наведені вище відповіді.
Андре Мантас

49

Додавання відповіді Девіда Лянга для Core 2.0 -

appsettings.jsonФайли пов'язані зі ASPNETCORE_ENVIRONMENTзмінною.

ASPNETCORE_ENVIRONMENTможе бути встановлений на будь-яке значення, але три значення підтримуються структурою: Development, Stagingі Production. Якщо ASPNETCORE_ENVIRONMENTйого не встановлено, він буде встановлений за замовчуванням Production.

Для цих трьох значень ці файли appset.ASPNETCORE_ENVIRONMENT.json підтримуються з вікна - appsettings.Staging.json, appsettings.Development.jsonіappsettings.Production.json

Вищевказані три файли json із налаштуваннями додатків можна використовувати для налаштування декількох середовищ.

Приклад - appsettings.Staging.json

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

Використовуйте Configuration["config_var"]для отримання будь-якого значення конфігурації.

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
Що з вкладеними об’єктами?
Артур Аттаут

8
Вкладені об’єкти можна отримати за допомогою Конфігурації ["MyConfig: SomethingNested"]
WeHaveCookies

1
Як видно з файлу github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/… у рядку 167 ASP.NET Core зараз завантажує appsettings.json+ appsettings.{env.EnvironmentName}.json. Отже, твердження про те, що ASP.NET Core завантажує лише файли розробки, постановки та виробництва appsettings.json, наразі є невірним.
mvdgun

1
тож я повинен ASPNETCORE_ENVIRONMENTкожен раз встановлювати змінну Windows ? Все було набагато простішим. Net 4. Ці фанатики JSON все-таки
Інструментарій

@Toolkit Ви можете встановити змінну середовища в глобальному масштабі. docs.microsoft.com/en-us/aspnet/core/fundamentals/…
Gautam

29

Я думаю, найпростіший спосіб - це DI. Приклад попадання в Controller.

// 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
Читаючи інші відповіді, це повинно бути найкращим.
harveyt

Я пропав безвісти services.AddSingleton(Configuration);, зараз це працює
Артур Медейрос

12

У конструкторі класу Startup ви можете отримати доступ до appsettings.json та багатьох інших налаштувань за допомогою введеного об’єкта IConfiguration:

Startup.cs Конструктор

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;

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

    }

public IConfiguration Configuration { get; }

Зміст appsettings.json

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

2
Мені допоміг синтаксис "Конфігурація [" Дід: Батько: Дитина "]).
Жак Олів'є

2
Це непересічна відповідь у тому, як вона структурована, зрозуміла та суттєва. Чудове спілкування
jolySoft

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

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

    }

4
Неповна відповідь
Carlos ABS

1

У моєму випадку це було просто, як використовувати метод Bind () на об’єкті Configuration. А потім додайте об’єкт як синглтон у DI.

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

Об'єкт Інструкції може бути таким же складним, як ви хочете.

{  
 "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 ви можете дотримуватися цього посібника:

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

Коли ви створюєте новий проект ASP.NET Core 3.1, у вас з'явиться наступна лінія конфігурації Program.cs:

Host.CreateDefaultBuilder(args)

Це дає можливість:

  1. ChainedConfigurationProvider: додає існуючу IConfiguration в якості джерела. У випадку конфігурації за замовчуванням додає конфігурацію хоста та встановлює її як перше джерело для конфігурації програми.
  2. appsettings.json за допомогою постачальника конфігурації JSON.
  3. appsettings.Environment.json за допомогою постачальника конфігурації JSON. Наприклад, appsettings.Production.json та appsettings.Development.json.
  4. Секрети програми, коли програма працює в середовищі розробки.
  5. Змінні середовища за допомогою постачальника конфігурації змінних середовища.
  6. Аргументи командного рядка за допомогою провайдера конфігурації командного рядка.

Це означає, що ви можете вводити IConfigurationта отримувати значення за допомогою рядкового ключа, навіть вкладених значень. Подібно доIConfiguration["Parent:Child"];

Приклад:

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"]синтаксис?
xr280xr

0

Я думаю, що найкращий варіант:

  1. Створіть клас моделі як конфігураційну схему

  2. Зареєструйтесь у DI: services.Configure (Configuration.GetSection ("democonfig"));

  3. Отримайте значення як об'єкт моделі від DI у своєму контролері:

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

0

З ядра 2.2 вище (вище) ви можете кодувати як нижче:

Крок 1. Створіть файл класу AppSettings.

Цей файл містить деякі методи, які допоможуть отримати значення за ключем від файлу appsettings.json. Виглядайте як код нижче:

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

Крок 2. Початкова конфігурація об’єкта AppSettings

Нам потрібно оголосити та завантажити файл appsettings.json під час запуску програми та завантажити інформацію про конфігурацію об’єкта AppSettings. Ми виконаємо цю роботу в конструкторі файлу Startup.cs. Зверніть увагу на рядокAppSettings.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);       
}

Гаразд, зараз у мене є файл appsettings.json з деякими клавішами, як показано нижче:

{
  "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"
    }
  }
}

Крок 3. Прочитайте значення конфігурації з дії

Демонструю дію в домашньому контролері нижче:

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

А нижче результат:

Клацніть, щоб побачити результат

Для отримання додаткової інформації, ви можете ознайомитися зі статтею отримати значення з appsettings.json в ядрі asp.net для отримання більш детального коду.


0

Його просто: В appsettings.json

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

У файлі .cs:

static IConfiguration conf = (new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build());
        public static string myValue1= conf["MyValues:Value1"].ToString();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.