Как прочитать значения 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-issues.com/2018/10/…
Ranadheer Reddy

@RanadheerReddy, внедрение зависимостей работает для контроллеров. Но что, если кому-то нужно прочитать значение в Middleware?
Александр Райан Баггетт

Ответы:


320

Это было несколько поворотов. Я изменил этот ответ, чтобы быть в курсе 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"));
    }
}

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"); }} return connectionString; }
dnxit

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

5
После добавления nuget 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. Используйте бета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;
    }
}

Можете ли вы поделиться конфигурацией JSON для "AppSettings" для справки
Ankit Mori

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

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, вам нужно сказать, где находится файл. Не видел этого в ответе.
Eric

Эрик, я перепроверю это, я не помню, чтобы добавить эту строку; Может ли это быть необходимо, только если имя файла json не является именем по умолчанию?
MDMoore313

Согласно MSDN, он не требуется для ASPNETCORE 2.0, хотя, похоже, он не работает и для меня. docs.microsoft.com/en-us/dotnet/api/…
Сб Тиру

1
Я могу подтвердить, что мне пришлось создать объект ConfigurationBuilder () и вызвать AddJSONFile () для загрузки файлов appSettings.json в словарь конфигурации. Это 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"]
Иокаб

... и вы можете сделать: config ["Storage: ConnectionString"], чтобы получить элементы внутри json. Я могу подтвердить, что эта техника работает на .net core 3 и работает на инжекционном построении.
Марио Мейреллес

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 Dependency Injection:

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 в тестовых проектах, используя тот же подход?
С.Сива,

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. Наконец, вы можете сделать:

    конфиг [ "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

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

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 вы можете сделать это довольно просто без каких-либо сторонних зависимостей.

Я создал суть для этого , но вы можете использовать этот класс для чтения файла 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.