Получение значения из appsettings.json в ядре .NET

Не уверен, что мне здесь не хватает, но я не могу получить значения из моего appsettings.json в моем основном приложении .net. У меня есть 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 всегда равно нулю. Что-то мне здесь не хватает?


person aman    schedule 25.10.2017    source источник
comment
Пожалуйста, прочтите документацию о том, как использовать конфигурацию. Вы неправильно настроили конфигурацию в своем классе запуска.   -  person poke    schedule 25.10.2017
comment
это можно даже упростить, просто используя внедрение зависимостей IConfiguration. Это объясняется здесь кодирование -issues.com/2018/10/   -  person Ranadheer Reddy    schedule 09.10.2018
comment
Тот факт, что на этот вопрос существует так много совершенно разных ответов, подчеркивает проблему. Почти заставляет меня задуматься, проще ли просто прочитать файл настроек и выполнить десериализацию в объект, созданный с помощью онлайн-генератора классов json - ›C #. Мне кажется примитивным иметь настройки, не являющиеся строго типизированными.   -  person Damien    schedule 10.06.2021


Ответы (15)


Программа и класс Startup

.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);
    }
}
person David Liang    schedule 25.10.2017
comment
Как я могу получить доступ к значениям в классе, в котором хранятся мои данные? - person Lukas Hieronimus Adler; 10.01.2018
comment
@LukasHieronimusAdler: См. Раздел примеров Controller в исходном вопросе ?? Получите доступ к значению, выполнив IOptions<AppSettings> settings и settings.Value ?? - person David Liang; 11.01.2018
comment
@DavidLiang, если я изменяю файл appsettings.json вручную во время выполнения, мой объект настроек IOptions ‹AppSettings› не получает измененные значения. Что случилось? Если добавить это: .AddJsonFile (appsettings.json, необязательно: false, reloadOnChange: true) Для меня он должен перезагружаться при внешнем изменении, верно? - person Lukas Hieronimus Adler; 12.01.2018
comment
@LukasHieronimusAdler: Вы можете использовать IOptionsSnapshot<T> вместо IOptions<T>. Вы можете ознакомиться с этой статьей: offer.solutions/blog/articles/2017/02/17/. Однако у меня не было возможности попробовать это самостоятельно. - person David Liang; 12.01.2018
comment
@DavidLiang, да, он все еще работает, но я не могу получить доступ к IOptionsSnapshot ‹T› из обычных классов. Если я передаю IOptionsSnapshot ‹T› в конструкторе, как в классах контроллеров, необходимо передать этот объект вручную, но как я могу получить к нему доступ? Надеюсь, вы понимаете, о чем я. Спасибо за вашу помощь - person Lukas Hieronimus Adler; 15.01.2018
comment
Я думаю, вы получаете доступ к IOptionsSnapshot<T> классу так же, как и к IOptions<T>? А для того, чтобы классы могли получать IOptionsSnapshot<T>, вам просто нужно ввести T в автозагрузку, точно так же, как и IOptions<T>! Прочтите статью несколько раз и найдите документацию Microsoft по этой теме. Не глядя на ваш исходный код, я не понимаю, с какой проблемой вы столкнулись. Извините - person David Liang; 15.01.2018
comment
Не могли бы вы сделать это простым, как отрывок? - person Syaiful Nizam Yahya; 13.07.2018
comment
Какой ужасный шаг назад от полного стека .net - person Aaron; 21.10.2018
comment
Хорошо, поэтому для .NET Core 3 вам нужен пакет Microsoft.Extensions.Options.ConfigurationExtensions, и он отлично работает - person Tomas Bruckner; 29.09.2019
comment
Смешно, что нам нужно столько объяснений для доступа к простой настройке приложения ... что-то, что раньше было одной строкой в ​​.NET Framework. Я понимаю, что внедрение зависимостей - это вообще хорошо, но в данном случае это скорее неприятность, чем помощь. На этот раз кажется, что C # думает о коде, а не о разработчике - все это немного похоже на Java. - person Jon Story; 14.04.2020
comment
Примечание для будущего себя: метод GetValue<T> находится в Microsoft.Extensions.Configuration.Binder пакете Nuget - person Jérôme MEVEL; 06.10.2020

Просто создайте файл 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"];
person shajji    schedule 10.08.2018
comment
Не используйте это в производстве. Именно такой подход вызвал утечку памяти в нашем веб-API. Если вы используете netcore, вы можете внедрить IConfiguration буквально где угодно, просто посмотрите ответы выше. - person André Mantas; 08.10.2019
comment
Я бы не рекомендовал внедрять IConfiguration везде, потому что это может вызвать некоторые проблемы с безопасностью; вместо этого вы можете создать несколько уровней абстракции того, что вам нужно, из этой конфигурации и использовать те, где вам это нужно. Таким образом, ваш код будет более защищенным, и ваш код не будет зависеть от IConfiguration или какой-либо реализации. - person HellBaby; 31.07.2020

Добавление к ответу Дэвида Ляна для Core 2.0 -

appsettings.json файлы связаны с ASPNETCORE_ENVIRONMENT переменной.

ASPNETCORE_ENVIRONMENT можно установить любое значение, но платформа поддерживает три значения: Development, Staging и Production. Если ASPNETCORE_ENVIRONMENT не установлен, по умолчанию будет Production.

Для этих трех значений эти файлы appsettings.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; }
}
person Aseem Gautam    schedule 22.02.2018
comment
А как насчет вложенных объектов? - person Arthur Attout; 17.04.2018
comment
Вложенные объекты можно получить с помощью Configuration [MyConfig: SomethingNested] - person WeHaveCookies; 16.05.2018
comment
Как видно в файле github.com/aspnet / AspNetCore / blob / master / src / DefaultBuilder / src / в строке 167 ASP.NET Core в настоящее время загружает appsettings.json + appsettings.{env.EnvironmentName}.json. Таким образом, утверждение, что ASP.NET Core загружает только файлы appsettings.json для разработки, подготовки и производства, в настоящее время неверно. - person mvdgun; 03.04.2019
comment
так что я должен каждый раз устанавливать переменную Windows ASPNETCORE_ENVIRONMENT? В .Net 4 все было намного проще. Эти фанатики JSON сильно облажались. - person Toolkit; 02.08.2019
comment
@Toolkit Вы можете установить переменную среды глобально. docs.microsoft. ru / en-us / aspnet / core / Основы / - person Aseem Gautam; 02.08.2019

Думаю, самый простой способ - это 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");
        ...
    }
}
person Sith2021    schedule 26.10.2018
comment
Читая другие ответы, это должно быть лучшим. - person Sith2021; 26.10.2018
comment
Мне не хватало services.AddSingleton(Configuration);, теперь работает - person Arthur Medeiros; 11.11.2019

В конструкторе класса 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"
    }
  }
person Shadi Namrouti    schedule 06.01.2019
comment
Мне помог синтаксис «Конфигурация [Дед: Отец: Дитя]». - person Jacques Olivier; 17.04.2019
comment
Это выдающийся ответ, поскольку он структурирован, ясен и по существу. Отличное общение - person jolySoft; 10.07.2019

Для 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();
    }
}
person Ogglas    schedule 22.04.2020
comment
Где я могу узнать больше о синтаксисе IConfiguration["Parent:Child"]? - person xr280xr; 30.06.2020
comment
@ xr280xr Подробности синтаксиса можно найти здесь docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/ и здесь docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration / Та же страница, разные разделы, но эта страница в целом содержит подробности. - person Craig; 22.08.2020
comment
@ xr280xr Стоит отметить, что использование шаблона параметров является предпочтительным методом получения значений конфигурации. docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/ - person Craig; 22.08.2020

В моем случае это было просто, как использовать метод Bind () для объекта Configuration. А затем добавьте объект как одноэлементный в DI.

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

Объект Instruction может быть сколь угодно сложным.

{  
 "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": "[email protected]",
       "CellNumber": "0833 468 378",
       "HomeNumber": "0833 468 378",
      }
      "CountryOfBirth": "710"
    }
  }
person Lizo Matala    schedule 07.11.2018

Начиная с ядра 2.2 Asp.net и выше, вы можете кодировать, как показано ниже:

Шаг 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": "[email protected]",
      "Pass": "123456"
    }
  }
}

Шаг 3. Считайте значение конфигурации из действия

Я делаю демонстрационное действие в контроллере Home, как показано ниже:

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 для получения более подробной информации.

person Dung Do Tien    schedule 11.06.2020

Это просто: в 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();

person Abhishek Pandey    schedule 22.07.2020
comment
Хорошо работает в Dot net core 3.1 - person Nikhil Dinesh; 22.12.2020

.NET core 3.X

Нет необходимости создавать новую модель и устанавливать ее в Startup.cs.

Контроллер Добавить новый пакет - с помощью Microsoft.Extensions.Configuration;

public class HomeController : Controller
{
    private readonly IConfiguration _mySettings;

    public HomeController (IConfiguration mySettings)
    {
         _mySettings= mySettings;
    }
 
    //ex: you can get value on below function 
    public IEnumerable<string> Get()
    {
        var result = _config.GetValue<string>("AppSettings:Version"); // "One"
        return new string[] { result.ToString() };
    }
}
person Jorge Eduardo    schedule 21.10.2020

Думаю, лучший вариант:

  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;
    }
    
person Meghnath Das    schedule 20.04.2020

  1. Добавьте сюда требуемый ключ вот так. В этом случае SecureCookies:

Добавьте сюда требуемый ключ, вот так. В данном случае это SecureCookies

  1. В startup.cs добавьте конструктор

     public Startup(IConfiguration configuration)
     {
         Configuration = configuration;
    
     }
     public IConfiguration Configuration { get; }
    
  2. Доступ к настройкам с помощью Configuration [SecureCookies]

person Bijin Palakkal    schedule 08.01.2021

Это обычно происходит, в частности, с vscode, как если бы я Предположим из-за того, как настраивается launch.json.

На основании этого ответа мне пришлось перенастроить базовый путь, по которому выполняется поиск конфигурации, на путь к DLL, и, поскольку настройка по умолчанию была необязательной, было трудно отследить это в приложении .net core 3.1 и net 5.0. Вот как я перенастроил

Program.cs:

using System;
using System.IO;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace API
{
    public class Program
    {
        public static int Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
            return 0;
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration(c =>
            {
                var codeBase = Assembly.GetExecutingAssembly().Location;
                var uri = new UriBuilder(codeBase);
                var path = Uri.UnescapeDataString(uri.Path);
                var assembyDirectory = Path.GetDirectoryName(path);
                c.SetBasePath(assembyDirectory);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            ;
        }
    }
}

Я мог получить доступ к конфигурации в Startup.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Model;

namespace API
{
    public class Startup
    {
        public IConfiguration Configuration { get; }

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

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var myOptions = Configuration.To<ApiConfig>();
            services.AddAuthentication(myOptions.Secret);
            services.AddControllers();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
        }
    }
}
person Nae    schedule 15.02.2021

Я обнаружил, что проще всего сделать это с помощью .NET Core 3+. Я обнаружил, что все другие методы использования HostBuilders и т. Д. Немного затянуты и не так удобочитаемы. Это не специально для ASP.Net, но вы можете адаптировать его ...

Вот рабочий пример: https://github.com/NotoriousPyro/PyroNexusTradingAlertBot/blob/develop/PyroNexusTradingAlertBot/Program.cs

Создайте json:

{
"GlobalConfig": {
    "BlacklistedPairs": [ "USD", "USDT", "BUSD", "TUSD", "USDC", "DAI", "USDK" ]
},
"CoinTrackingConfig": {
    "Cookie1": "",
    "Cookie2": "",
    "ApiKey": "",
    "ApiSecret": "",
    "UpdateJobs": [
    {
        "Name": "Binance",
        "Path": "binance_api",
        "JobId": 42202
    },
    {
        "Name": "Bitfinex",
        "Path": "bitfinex_api",
        "JobId": 9708
    }
    ]
},
"DiscordConfig": {
    "BotToken": ""
}
}

Создайте класс для объектов json:

class GlobalConfig
{
    public string[] BlacklistedPairs { get; set; }
}
class CoinTrackingConfig
{
    public string Cookie1 { get; set; }
    public string Cookie2 { get; set; }
    public string ApiKey { get; set; }
    public string ApiSecret { get; set; }
    public List<CoinTrackingUpdateJobs> UpdateJobs { get; set; }
}

class CoinTrackingUpdateJobs
{
    public string Name { get; set; }
    public string Path { get; set; }
    public int JobId { get; set; }
}

class DiscordConfig
{
    public string BotToken { get; set; }
}

Создайте вспомогательный класс:

private class Config
{
    private IConfigurationRoot _configuration;
    public Config(string config) => _configuration = new ConfigurationBuilder()
            .AddJsonFile(config)
            .Build();

    public T Get<T>() where T : new()
    {
        var obj = new T();
        _configuration.GetSection(typeof(T).Name).Bind(obj);
        return obj;
    }
}

Параметры поставщика услуг и конструктор услуг:

public class DiscordServiceOptions
{
    public string BotToken { get; set; }
}

public DiscordService(IOptions<DiscordServiceOptions> options, ILogger<DiscordService> logger)
{
    _logger = logger;
    _client = new DiscordSocketClient();
    _client.Log += Log;
    _client.Ready += OnReady;
    _client.Disconnected += OnDisconnected;
    _client.LoginAsync(TokenType.Bot, options.Value.BotToken);
    _client.StartAsync();
}

Инициализируйте его так (передайте конфигурацию поставщику услуг - параметры IOptions будут переданы при создании службы):

static async Task Main(string[] args)
{
    var _config = new Config("config.json");

    var globalConfig = config.Get<GlobalConfig>();
    var coinTrackingConfig = config.Get<CoinTrackingConfig>();
    var discordConfig = config.Get<DiscordConfig>();

    _services = new ServiceCollection()
        .AddOptions()
        .Configure<DiscordServiceOptions>(options =>
        {
            options.BotToken = discordConfig.BotToken;
        })
        .AddSingleton<IDiscordService, DiscordService>()
        .AddLogging(logging =>
        {
            logging.SetMinimumLevel(LogLevel.Trace);
            logging.AddNLog(new NLogProviderOptions
            {
                CaptureMessageTemplates = true,
                CaptureMessageProperties = true
            });
        })
        .BuildServiceProvider();
}
person NotoriousPyro    schedule 01.03.2021
comment
как получить доступ к globalConfig в контроллере? - person mRizvandi; 01.04.2021
comment
Я расширил пример. Надеюсь, это поможет ... - person NotoriousPyro; 02.04.2021

person    schedule
comment
Неполный ответ - person Carlos ABS; 17.04.2019