Подтвердить что ты не робот

Как читать значения AppSettings из.json файла в ASP.NET Core

Я установил свои данные AppSettings в appsettings/Config.json следующим образом:

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

Я искал онлайн о том, как читать значения AppSettings из.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 Core?

4b9b3361

Ответ 1

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

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

Чтобы работать с настройками в вашем приложении ASP.NET, рекомендуется только создать экземпляр Configuration в ваших приложениях класса Startup. Затем используйте шаблон "Параметры" для доступа к отдельным настройкам. Скажем, у нас есть файл appsettings.json который выглядит так:

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

Ответ 2

Во-первых: имя сборки и пространство имен Microsoft.Framework.ConfigurationModel изменено на Microsoft.Framework.Configuration. Поэтому вы должны использовать: eg

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

как зависимость в project.json. Используйте бета5 или 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();
}

Если вы хотите получить переменную из config.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;
    }
}

Ответ 3

Для.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() { }
    }
}

И конфигурация фактически подраздел моего 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.

Ответ 4

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

Configuration["AppSettings:token"]

Ответ 5

С Core 2.2, и самым простым способом...

public IActionResult Index([FromServices] IConfiguration config) 
{
    var myValue = config.GetValue<string>("MyKey");
}

appsettings.json автоматически загружается и доступны через любой из конструктора или инъекции действий, а там GetSection метода на IConfiguration а. Не нужно изменять Startup.cs или Program.cs если вам нужен только appsettings.json.

Ответ 6

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

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

Ответ 7

Только чтобы дополнить ответ Юваля Ицчакова.

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

public IConfiguration Configuration { get; set; }

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

Ответ 8

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

Объявите ваши пары ключ/значение в appsettings.json:

{
  "MyKey": "MyValue"
}

Вставьте службу конфигурации в startup.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);
        });

Ответ 9

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

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

using Microsoft.Extensions.Configuration;

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

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

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

config["NameOfYourKey"]

Ответ 10

В дополнение к существующим ответам я хотел бы упомянуть, что иногда было бы полезно иметь методы расширения для IConfiguration для простоты.

Я сохраняю конфигурацию JWT в appsettings.json, поэтому класс методов расширения выглядит следующим образом:

public static class ConfigurationExtensions
{
    public static string GetIssuerSigningKey(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:SecurityKey");
        return result;
    }

    public static string GetValidIssuer(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Issuer");
        return result;
    }

    public static string GetValidAudience(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Audience");
        return result;
    }

    public static string GetDefaultPolicy(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Policies:Default");
        return result;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey(this IConfiguration configuration)
    {
        var issuerSigningKey = configuration.GetIssuerSigningKey();
        var data = Encoding.UTF8.GetBytes(issuerSigningKey);
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string[] GetCorsOrigins(this IConfiguration configuration)
    {
        string[] result =
            configuration.GetValue<string>("App:CorsOrigins")
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray();

        return result;
    }
}

Это экономит вам много строк, и вы просто пишете чистый и минимальный код:

...
x.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuerSigningKey = true,
    ValidateLifetime = true,
    IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
    ValidAudience = _configuration.GetValidAudience(),
    ValidIssuer = _configuration.GetValidIssuer()
};

Также возможно зарегистрировать экземпляр IConfiguration как singleton и ввести его туда, где вам нужно - я использую контейнер Autofac здесь, как вы это делаете:

var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();

Вы можете сделать то же самое с MS Dependency Injection:

services.AddSingleton<IConfigurationRoot>(appConfiguration);

Ответ 11

Они просто продолжают менять вещи - просто обновили 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)

Ответ 12

Вот полный пример использования ASP.NET Core!

articles.json

{
  "shownArticlesCount": 3,
  "articles": [
    {
      "title": "My Title 1",
      "thumbnailLink": "example.com/img1.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
    {
      "title": "My Title 2",
      "thumbnailLink": "example.com/img2.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
  ]
}

ArticleContainer.cs

public class ArticleContainer
{
    public int ShownArticlesCount { get; set; }

    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Title { get; set; }

    public string ThumbnailLink { get; set; }

    public string AuthorName { get; set; }

    public string AuthorProfileLink { get; set; }

    public DateTime PublishDate { get; set; }

    public string Text { get; set; }

    public string Link { get; set; } 
}

Startup.cs

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

    public Startup(IHostingEnvironment env)
    {
        ArticleConfiguration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("articles.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        services.Configure<ArticleContainer>(ArticleConfiguration);
    }
}

Index.cshtml.cs

public class IndexModel : PageModel
{
    public ArticleContainer ArticleContainer { get;set; }

    private readonly IOptions<ArticleContainer> _articleContainer;

    public IndexModel(IOptions<ArticleContainer> articleContainer)
    {
        _articleContainer = articleContainer;
    }

    public void OnGet()
    {
        ArticleContainer = _articleContainer.Value;
    }
}

Index.cshtml.cs

<h1>@Model.ArticleContainer.ShownArticlesCount</h1>

Ответ 13

Вы можете попробовать ниже код. это работает для меня.

public class Settings
    {
        private static IHttpContextAccessor _HttpContextAccessor;
        public Settings(IHttpContextAccessor httpContextAccessor)
        {
            _HttpContextAccessor = httpContextAccessor;
        }
        public static void Configure(IHttpContextAccessor httpContextAccessor)
        {
            _HttpContextAccessor = httpContextAccessor;
        }
        public static IConfigurationBuilder Getbuilder()
        {
            var builder = new ConfigurationBuilder()
              .SetBasePath(Directory.GetCurrentDirectory())
              .AddJsonFile("appsettings.json");
            return builder;
        }

        public static string GetAppSetting(string key)
        {
            //return Convert.ToString(ConfigurationManager.AppSettings[key]);
            var builder = Getbuilder();
            var GetAppStringData = builder.Build().GetValue<string>("AppSettings:" + key);
            return GetAppStringData;
        }

        public static string GetConnectionString(string key="DefaultName")
        {
            var builder = Getbuilder();
            var ConnectionString = builder.Build().GetValue<string>("ConnectionStrings:"+key);
            return ConnectionString;
        }
    }

Здесь я создал один класс, чтобы получить строку подключения и настройки приложения.

В файле Startup.cs вам необходимо зарегистрировать класс, как показано ниже.

public class Startup
{      

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {           

        var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        Settings.Configure(httpContextAccessor);
    }
}

Ответ 14

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

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

Ответ 15

Получить его внутри контроллера как объект через вызов Get<YourType>()

public IActionResult Index([FromServices] IConfiguration config) { BillModel model= config.GetSection("Yst.Requisites").Get<BillModel>(); return View(model); }

Ответ 16

.NET Core 2.1.0

  1. Создайте файл .json в корневом каталоге
  2. В вашем коде:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. Установите следующие зависимости:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json

4. Тогда ВАЖНО: Щелкните правой кнопкой мыши файл appsettings.json → щелкните Свойства → выберите Копировать, если новее: enter image description here

  1. Наконец, вы можете сделать:

    конфиг [ "key1"]

Учитывая, что мой конфигурационный файл будет выглядеть так:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}

Ответ 17

.NET Core 3.0 Может быть, это не лучший способ получить значение из appsettings.json, но он прост и работает в моем приложении !!

appsettings.json

{
"ConnectionStrings": {
        "DefaultConnection":****;"
      }   

"AppSettings": {
        "APP_Name": "MT_Service",
        "APP_Version":  "1.0.0"
    }
}

контроллер:

Вверху:

using Microsoft.Extensions.Configuration;

В вашем коде:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];