Как читать значения AppSettings из Config.json in ASP.NET Керн

у меня есть настройка AppSettings в Config.json вот так:

{
  "AppSettings": {
        "token": "1234"
    }
}

Я искал в интернете, как читать значения AppSettings из config.json, но я не мог получить ничего полезного.

пробовал:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

Я знаю с ASP.NET 4.0 вы можете сделать это:

System.Configuration.ConfigurationManager.AppSettings["token"];

но как мне это сделать в ASP.NET ядро?

11 ответов


это было несколько поворотов и поворотов. Я изменил этот ответ, чтобы быть в курсе ASP.NET Core 2.0 (по состоянию на 26/02/2018).

это в основном взято из официальная документация:

для работы с настройками в вашем ASP.NET применение, рекомендуется, чтобы вы только экземпляр Configuration в класса. Затем используйте шаблон параметры для доступа к отдельным настройкам. Допустим, у нас есть appsettings.json файл, который выглядит следующим образом:

{
   "ApplicationName": "MyApp",
   "Version": "1.0.0"
}

и у нас есть объект POCO, представляющий конфигурацию:

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

теперь мы строим конфигурацию в Startup.cs:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

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

        Configuration = builder.Build();
    }
}

отметим, что appsettings.json будет зарегистрированы по умолчанию в .NET Core 2.0. Мы также можем зарегистрировать appsettings.{Environment}.json файл конфигурации для каждой среды, если это необходимо.

если мы хотим внедрить нашу конфигурацию в наши контроллеры, нам нужно будет зарегистрировать ее во время выполнения. Мы сделайте это через Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}

и мы вводим его так:

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

полное Startup класс:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

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

        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // Add functionality to inject IOptions<T>
        services.AddOptions();

        // Add our Config object so it can be injected
        services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
    }
}

во-первых: Имя сборки и пространство имен Microsoft.Рамки.ConfigurationModel изменился на Microsoft.Рамки.Конфигурация. Поэтому вы должны использовать: например,

"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"

в зависимости project.json. Используйте beta5 или 6, Если у вас не установлено 7. Затем вы можете сделать что-то подобное в Startup.cs.

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
     var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
     Configuration = configurationBuilder.Build();
}

если вы хотите получить переменную из конфига.json вы можете получить его сразу, используя:

public void Configure(IApplicationBuilder app)
    {
        // Add .Value to get the token string
        var token = Configuration.GetSection("AppSettings:token");
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("This is a token with key (" + token.Key + ") " + token.Value);
        });
    }

или вы можете создать класс называется AppSettings следующим образом:

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

и настройте службы следующим образом:

public void ConfigureServices(IServiceCollection services)
{       
    services.AddMvc();

    services.Configure<MvcOptions>(options =>
    {
        //mvc options
    });

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

а затем получить доступ к нему через, например, контроллер, как это:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}

для .NET Core 2.0 все немного изменилось. Конструктор запуска принимает объект конфигурации в качестве параметра, поэтому с помощью ConfigurationBuilder не требуется. Вот мое:

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

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<StorageOptions>(Configuration.GetSection("AzureStorageConfig"));
}

мой POCO является StorageOptions объект, упомянутый в верхней части:

namespace Brazzers.Models
{
    public class StorageOptions
    {
        public String StorageConnectionString { get; set; }
        public String AccountName { get; set; }
        public String AccountKey { get; set; }
        public String DefaultEndpointsProtocol { get; set; }
        public String EndpointSuffix { get; set; }

        public StorageOptions() { }
    }
}

и конфигурация на самом деле является подразделом my appsettings.json файл с именем AzureStorageConfig:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\mssqllocaldb;",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=brazzerswebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "AzureStorageConfig": {
    "AccountName": "brazzerswebapp",
    "AccountKey": "Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==",
    "DefaultEndpointsProtocol": "https",
    "EndpointSuffix": "core.windows.net",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=brazzerswebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  }
}

единственное, что я добавлю, это то, что, поскольку конструктор изменился, я не проверял, что-то дополнительное нужно сделать для его загрузки appsettings.<environmentname>.json в противоположность appsettings.json.


Если вы просто хотите получить значение токена, используйте

Configuration["AppSettings:token"]


Они просто продолжают менять вещи - только что обновили VS и имели всю бомбу проекта, на пути к восстановлению, и новый способ выглядит так:

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

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

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

я пропустил эту строку!

.SetBasePath(env.ContentRootPath)

поэтому я сомневаюсь, что это хорошая практика, но она работает локально, я обновлю это, если это не удастся при публикации/развертывании (в веб-службу IIS).

Шаг 1.) Добавьте эту сборку в начало своего класса (в моем случае класс контроллера):

using Microsoft.Extensions.Configuration;

Шаг 2.) Добавить это или что-то вроде этого:

var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json").Build();

Шаг 3.) Вызовите значение вашего ключа, сделав это (возвращает строку):

config["NameOfYourKey"]


просто дополнить Юваль Itzchakov ответа.

вы можете загрузить конфигурацию без функции builder, вы можете просто ввести ее.

public IConfiguration Configuration { get; set; }

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

для .NET Core 2.0 вы можете просто:

объявите свои пары ключ / значение в appsettings.в JSON:

{
  "MyKey": "MyValue
}

внедрить службу конфигурации при запуске.CS и получить значение с помощью сервиса

using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IConfiguration configuration,
                          ... other injected services
                          )
    {
        app.Run(async (context) =>
        {
            string myValue = configuration["MyKey"];
            await context.Response.WriteAsync(myValue);
        });

следующие работы для консольных приложений;

1 - установите следующие nuget пакеты (.csproj);

<ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0-preview2-35157" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0-preview2-35157" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0-preview2-35157" />
  </ItemGroup>

2 - создать appsettings.json на корневом уровне. Щелкните правой кнопкой мыши на нем и " скопировать в выходной каталог "как"копировать, если новее".

3-пример файла конфигурации:

{
  "AppConfig": {
    "FilePath": "C:\temp\logs\output.txt"
  }
}

4 - программы.cs

configurationSection.Key и configurationSection.Value будет иметь свойства конфигурации.

static void Main(string[] args)
{
    try
    {

        IConfigurationBuilder builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        IConfigurationRoot configuration = builder.Build();
        // configurationSection.Key => FilePath
        // configurationSection.Value => C:\temp\logs\output.txt
        IConfigurationSection configurationSection = configuration.GetSection("AppConfig").GetSection("FilePath");  

    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}

этот "обман"? Я только что сделал свою конфигурацию в Startup class static, а затем я могу получить к ней доступ из любого другого места:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    public static IConfiguration Configuration { get; set; }

Спасибо @Brian Moore

путем изменения конфигурации на статический при запуске.cs, я могу получить доступ к моей строке подключения, еще раз, с одной строкой кода:

мои appsettings.файл json:

  "MyConnectionStrings": {
    "Connection1": "ConnectionString..."
  }
}

Мой Стартап.CS-файл, где я устанавливаю конфигурацию как статическую:

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

    public static IConfiguration Configuration { get; set; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddDbContext<ITFixedAssetsContext>(options => options.UseSqlServer(Configuration.GetConnectionString("ITFixedAssets")));
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

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

        app.UseMvc();
    }
}

доступ к моему значению соединения:

     string conString = Startup.Configuration.GetSection("MyConnectionStrings").GetSection("Connection1").Value.ToString();