Как читать значения AppSettings из конфигурации.JSON в ASP.NET основной
у меня есть мои настройки AppSettings в конфигурации.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 ядро?
11 ответов:
это было несколько поворотов и поворотов. Я изменил этот ответ, чтобы быть в курсе ASP.NET ядро 2.0 (по состоянию на 26/02/2018).
это в основном взято из официальная документация:
для работы с настройками в вашем ASP.NET приложение, рекомендуется создавать только экземпляр a
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")); } }
во-первых: Имя сборки и пространство имен корпорации Майкрософт.Рамки.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.
Они просто продолжают менять вещи – только что обновили 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"]
просто чтобы дополнить ответ Юваля Ицхакова.
вы можете загрузить конфигурацию без функции 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); } }
этот "обман"? Я просто сделал свою конфигурацию в 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();
Comments