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