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


247

Я налаштував свої дані 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?




це можна навіть спростити, лише використовуючи введення залежності IConfiguration (в .net core 2.0). Що пояснюється тут coding-isissue.com/2018/10/…
Ranadheer Reddy

@RanadheerReddy, ін'єкція залежності працює для контролерів. Але що якщо комусь потрібно прочитати значення в Middleware?
Олександр Райан

Відповіді:


320

Це мало кілька поворотів. Я змінив цю відповідь, щоб бути в курсі ASP.NET Core 2.0 (станом на 26.02.2018).

Це в основному взято з офіційної документації :

Для роботи з налаштуваннями у вашій програмі ASP.NET рекомендується лише інстанціювати клас a 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"));
    }
}

3
версія "1.0.0-beta4"працює на моїй немає "1.0.0-alpha4". Дуже дякую!
Олувафемі

2
Мені потрібно передати налаштування іншому шару з класу утиліти, тому мені потрібно щось на зразок цієї загальнодоступної статичної рядки GetConnectionString () {if (string.IsNullOrEmpty (connectionString)) {var builder = new ConfigurationBuilder () .AddJsonFile ("config.json "); Конфігурація = builder.Build (); connectionString = Configuration.Get ("Дані: DefaultConnection: ConnectionString"); }} зворотне з'єднанняString; }
dnxit

2
Я отримуюArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
Пітер

5
Після додавання нугету Microsoft.Extensions.Options.ConfigurationExtensionsвін працював як очікувалося.
Пітер

2
Приємне пояснення логіки процесу конфігурації, але воно пропускає головний момент: SetBasePath () і AddJsonFile () - це методи розширення, які містяться глибоко в рамках в окремі збірки. Отже, для початку роботи потрібно встановити Microsoft.Extensions.Configuration.FileExtensions та Microsoft.Extensions.Configuration.Json на додаток до Microsoft.Extensions.Configuration.
Божидар Стойнефф

63

Спочатку: Назва збірки та простір імен Microsoft.Framework.ConfigurationModel змінено на Microsoft.Framework.Configuration. Тож слід використовувати: напр

"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();
}

Якщо ви хочете отримати змінну з 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;
    }
}

Ви можете поділитися конфігурацією json для "AppSettings" для довідки
Ankit Mori

Мені потрібні цілі конфігурації appSettings.json у класі, для цього я створив клас відповідно до JSON і використовую Configuration.Get<AppSettings>()для деріаріалізації всього файлу замість конкретного розділу.
Нілай

52

У .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 FictionalWebApp.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=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

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

Єдине, що я додам, це те, що, оскільки конструктор змінився, я не перевіряв, чи потрібно щось додаткове робити для його завантаження appsettings.<environmentname>.jsonна відміну від appsettings.json.


Просто зауважте, що вам все-таки потрібно кинути .AddJsonFile ("yourfile.json") у ConfigConfiguration. IE, вам потрібно сказати, де знаходиться файл. Не бачив цього у відповіді.
Ерік

Ерік, я ще раз це повторюю, я не пам'ятаю, щоб додати цей рядок; Можливо, це потрібно, лише якщо ім'я файлу json не є ім'ям за замовчуванням?
MDMoore313

На MSDN він не потрібен для ASPNETCORE 2.0, хоча, здається, він і для мене не працює. docs.microsoft.com/en-us/dotnet/api/…
Sat

1
Я можу підтвердити, що мені довелося створити об’єкт ConfigurationBuilder () і зателефонувати AddJSONFile (), щоб завантажити файли appSettings.json у словник config. Це ASP.NET Core 2.0. Це помилка, оскільки це суперечить тому, що говорить MSDN?
Сб Тіру

1
Чи можете ви навести приклад того, як ви вводите StorageOptions у свої контролери? Якщо я використовую підхід Hug до використання ін'єкції залежності public HomeController(IOptions<StorageOptions> settings), я отримую це повідомлення про помилку: типи, пов'язані з моделями, комплексні типи не повинні бути абстрактними або типовими типами і повинні мати конструктор без параметрів.
Jpsy

30

За допомогою .NET 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.


2
ще простіше:var myValue = config["MyKey"]
jokab

... і ви можете зробити: config ["Storage: ConnectionString"], щоб отримати елементи всередині json. Я можу підтвердити, що ця методика працює на .net core 3 і працює над конструктивною інжекцією.
Mário Meyrelles

29

Якщо ви просто хочете отримати значення маркера, тоді використовуйте

Configuration["AppSettings:token"]


4
Для цього вам потрібно заздалегідь ініціювати екземпляр IConfiguration через ConfigurationBuilder.
Ε Г І І І О

20

.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"];

Досить прямо. Дякую за це, ви мені допомогли!
Метт

AddJsonFile не існує в ConfigurationBuilder
Essej

10

Наступні роботи для консольних додатків;

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

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

8

Я сумніваюся, що це хороша практика, але вона працює на місцях. Я оновлю це, якщо воно не вдасться при публікації / розгортанні (до веб-сервісу IIS).

Крок 1 - Додайте цю збірку до початку вашого класу (у моєму випадку класу контролерів):

using Microsoft.Extensions.Configuration;

Крок 2 - Додайте це чи щось подібне:

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

Крок 3 - Викличте значення вашого ключа, виконавши це (повертає рядок):

config["NameOfYourKey"]

Я думаю, це повинно бути добре за умови, що appsettings.jsonзнаходиться у правильному каталозі
Ju66ernaut

7

Просто для доповнення відповіді Юваля Ітчакова.

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

public IConfiguration Configuration { get; set; }

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

6

На додаток до існуючих відповідей я хотів би відзначити , що іноді це може бути корисно мати методи розширення для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екземпляр як однотонний та ввести його куди завгодно - я використовую контейнер Autofac ось як це зробити:

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

Ви можете зробити те ж саме з ін'єкцією залежної форми MS:

services.AddSingleton<IConfigurationRoot>(appConfiguration);

6

Ось повний випадок використання для 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>

"ASP.NET Core" Яка версія?
Стів Сміт

5

Вони просто змінюють речі - нещодавно оновивши Visual Studio і всю бомбу проекту, на шляху до відновлення і новий шлях виглядає так:

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)

1
Як ми можемо отримати значення AppSettings в тестових проектах, використовуючи той самий підхід?
S.Siva

2
They just keep changing things. Це. Майже кожна відповідь на цій сторінці стосується лише певної версії .Net Core.
Стів Сміт

4

.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 -> натисніть кнопку Властивості -> виберіть Копіювати, якщо новіше: введіть тут опис зображення

  1. Нарешті, ви можете зробити:

    config ["key1"]

Враховуючи, що мій конфігураційний файл буде виглядати так:

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

2

Ви можете спробувати нижче код. Це працює для мене.

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

2

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

@Ogglas ... як абонент WeatherForecastController () міг отримати клас, який реалізує IConfiguration?
Джонні Ву

1

Це було "обман"? Я щойно зробив мою Конфігурацію в класі запуску статичною, і тоді я можу отримати доступ до неї з будь-якого іншого місця:

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

1

Отримайте його всередині контролера як об'єкта за допомогою виклику Get<YourType>():

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

1

Спочатку слід ввести IConfiguration, а потім для читання з програм можна скористатися одним із таких способів:

  1. Отримати дані розділу

    var redisConfig = configuration.GetSection("RedisConfig");
  2. Отримайте значення в розділі

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. Отримати вкладене значення в розділі

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");

Ін'єкція працює для контролерів, але що робити, якщо я хочу використовувати її в Middleware, як тут ? Я використовую Redis як проміжне програмне забезпечення для кешування відповідей http.
Олександр Райан

1

Спосіб .NET Core 2.2

(Без сумніву, Microsoft знову змінить його на щось зовсім інше у наступній версії .NET.)

1. appSettings.json

Це може виглядати приблизно так. Тут ми будемо завантажувати Setting1 та Setting2

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Setting1": "abc",
  "Setting2": 123
}

2. AppSettings.cs

Клас POCO для вмісту Setting1 і Setting2. Ми завантажимо appsettings.json в цей об’єкт класу. Структура класу POCO повинна відповідати файлу JSON, властивості можуть бути вкладені в інші властивості / класи за бажанням.

public class AppSettings
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

3 Startup.cs

Завантажте appSettings.json в об’єкт AppSettings і почніть його використовувати:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        AppSettings settings = new AppSettings();

        Configuration = configuration;
        configuration.Bind(settings);

        // Now start using it
        string setting1 = settings.Setting1;
        int setting2 = settings.Setting2;
    }

0

З останньою ітерацією netcoreapp 3.1 out, ви можете це зробити досить просто без сторонніх залежностей.

Я створив для цього суть , але ви можете використовувати цей клас для читання файлу JSON та повернення динамічних властивостей.

using System.Text.Json;
using System.IO;

class ConfigurationLoader
{

    private dynamic configJsonData;
    public ConfigurationLoader Load(string configFilePath = "appsettings.json")
    {
        var appSettings = File.ReadAllText(configFilePath);
        this.configJsonData = JsonSerializer.Deserialize(appSettings, typeof(object));
        return this;
    }

    public dynamic GetProperty(string key)
    {
        var properties = key.Split(".");
        dynamic property = this.configJsonData;
        foreach (var prop in properties)
        {
            property = property.GetProperty(prop);
        }

        return property;
    }
}

Я спеціально зробив це, щоб я міг використовувати appconfig.json в моєму додатку консолі dotnet. Я просто ставлю це до своєї Program.Mainфункції:

var config = new ConfigurationLoader();
config.Load();
Console.WriteLine(config.GetProperty("Environment.Name"));

І це поверне dynamicоб’єкт у власність. (JsonElement, якщо це не примітив). Мій appsettings.jsonфайл виглядає приблизно так:

{
  "Environment": {
    "Token": "abc-123",
    "Name": "Production"
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.