Como ler valores AppSettings de um arquivo .json no ASP.NET Core

247

Eu configurei meus dados do AppSettings no arquivo appsettings / Config .json assim:

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

Eu pesquisei online sobre como ler os valores do AppSettings do arquivo .json, mas não consegui nada de útil.

Eu tentei:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

Eu sei com o ASP.NET 4.0 que você pode fazer isso:

System.Configuration.ConfigurationManager.AppSettings["token"];

Mas como faço isso no ASP.NET Core?

Oluwafemi
fonte
isso pode ser simplificado usando a injeção de dependência da configuração ICon (no .net core 2.0). O que é explicado aqui coding-issues.com/2018/10/…
Ranadheer Reddy
@RanadheerReddy, a injeção de dependência funciona para controladores. Mas e se alguém precisar ler um valor no Middleware?
Alexander Ryan Baggett

Respostas:

319

Isso teve algumas reviravoltas. Modifiquei esta resposta para estar atualizado com o ASP.NET Core 2.0 (a partir de 26/02/2018).

Isso é extraído principalmente da documentação oficial :

Para trabalhar com configurações no seu aplicativo ASP.NET, é recomendável que você instancie apenas um Configurationna Startupclasse do seu aplicativo . Em seguida, use o padrão Opções para acessar configurações individuais. Digamos que temos um appsettings.jsonarquivo parecido com este:

{
  "MyConfig": {
   "ApplicationName": "MyApp",
   "Version": "1.0.0"
   }

}

E nós temos um objeto POCO representando a configuração:

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

Agora criamos a configuração em 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();
    }
}

Observe que appsettings.jsonserá registrado por padrão no .NET Core 2.0. Também podemos registrar um appsettings.{Environment}.jsonarquivo de configuração por ambiente, se necessário.

Se queremos injetar nossa configuração em nossos controladores, precisamos registrá-la no tempo de execução. Fazemo-lo através de 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"));
}

E injetamos assim:

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

A Startupclasse completa :

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"));
    }
}
Yuval Itzchakov
fonte
3
versão "1.0.0-beta4"funciona no meu não "1.0.0-alpha4". Muito obrigado!
Oluwafemi
2
Preciso passar uma configuração para outra camada de uma classe de utilitário, então preciso de algo como esta sequência estática pública GetConnectionString () {if (string.IsNullOrEmpty (connectionString)) {var builder = new ConfigurationBuilder () .AddJsonFile ("config.json "); Configuração = builder.Build (); connectionString = Configuration.Get ("Dados: DefaultConnection: ConnectionString"); }} return connectionString; }
dnxit
2
Eu receboArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
Peter
5
Depois de adicionar o nuget Microsoft.Extensions.Options.ConfigurationExtensions, funcionou conforme o esperado.
Peter
2
Boa explicação da lógica do processo de configuração, mas perde um ponto importante: SetBasePath () e AddJsonFile () são métodos de extensão, berried profundamente na estrutura em assemblies separados. Portanto, para começar, é necessário instalar o Microsoft.Extensions.Configuration.FileExtensions e Microsoft.Extensions.Configuration.Json, além do Microsoft.Extensions.Configuration.
Bozhidar Stoyneff 12/02/19
63

Primeiro: o nome do assembly e o namespace do Microsoft.Framework.ConfigurationModel foi alterado para Microsoft.Framework.Configuration. Então você deve usar: por exemplo

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

como uma dependência em project.json. Use beta5 ou 6 se você não tiver 7 instalados. Então você pode fazer algo assim em 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();
}

Se você deseja recuperar uma variável do config.json, é possível obtê-la imediatamente usando:

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

ou você pode criar uma classe chamada AppSettings assim:

public class AppSettings
{
    public string token { get; set; }
}

e configure os serviços assim:

public void ConfigureServices(IServiceCollection services)
{       
    services.AddMvc();

    services.Configure<MvcOptions>(options =>
    {
        //mvc options
    });

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

e acesse-o através, por exemplo, de um controlador como este:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}
abraço
fonte
você pode agradar json configuração ação para "AppSettings" para referência
Ankit Mori
Eu preciso de configurações appSettings.json inteiras na classe, para isso, eu projetei a classe conforme JSON e uso Configuration.Get<AppSettings>()para desserializar o arquivo inteiro em vez de uma seção específica.
Nilay
52

Para o .NET Core 2.0, as coisas mudaram um pouco. O construtor de inicialização usa um objeto de configuração como parâmetro, portanto, ConfigurationBuildernão é necessário usar o . Aqui é minha:

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

Meu POCO é o StorageOptionsobjeto mencionado na parte superior:

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() { }
    }
}

E a configuração é na verdade uma subseção do meu appsettings.jsonarquivo, denominada 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"
  }
}

A única coisa que acrescentarei é que, desde que o construtor mudou, não testei se algo extra precisa ser feito para que ele seja carregado appsettings.<environmentname>.jsonem oposição a ele appsettings.json.

MDMoore313
fonte
Apenas uma observação de que você ainda precisa lançar .AddJsonFile ("yourfile.json") no ConfigConfiguration. IE, você precisa dizer onde está o arquivo. Não vi isso na resposta.
Eric
Eric, vou testar novamente isso, não me lembro de adicionar essa linha; Poderia ser necessário apenas se o nome do arquivo json não for o nome padrão?
MDMoore313
Por MSDN, não é necessário para o ASPNETCORE 2.0, embora também não pareça funcionar para mim. docs.microsoft.com/en-us/dotnet/api/…
Sáb Thiru
1
Posso confirmar que tive que criar um objeto ConfigurationBuilder () e chamar AddJSONFile () para carregar os arquivos appSettings.json no dicionário de configuração. Este é o ASP.NET Core 2.0. Isso é um bug, pois é contrário ao que o MSDN diz?
Sáb Thiru
1
Você pode dar um exemplo de como você injeta StorageOptions em seus controladores? Se eu usar a abordagem do hug de usar injeção de dependência public HomeController(IOptions<StorageOptions> settings), recebo a seguinte mensagem de erro: Tipos complexos ligados a modelos não devem ser abstratos ou de valor e devem ter um construtor sem parâmetros.
Jpsy
30

Com o .NET Core 2.2, e da maneira mais simples possível ...

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

appsettings.jsoné carregado automaticamente e está disponível por injeção de construtor ou de ação, e também existe um GetSectionmétodo IConfiguration. Não há necessidade de alterar Startup.csou Program.csse tudo o que você precisa é appsettings.json.

tnJed
fonte
2
ainda mais simples:var myValue = config["MyKey"]
jokab
... e você pode fazer: config ["Storage: ConnectionString"] para obter elementos dentro do json. Posso confirmar que esta técnica funciona no .net core 3 e na injeção de construção.
Mário Meyrelles 20/01
29

Se você apenas deseja obter o valor do token, use

Configuration["AppSettings:token"]

kodebot
fonte
4
Para que isso funcione, é necessário ter uma instância de IConfiguration inicializada via ConfigurationBuilder previamente.
Sep Г И О
20

.NET Core 3.0

Talvez não seja a melhor maneira de obter um valor de appsettings.json , mas é simples e funciona no meu aplicativo!

Arquivo appsettings.json

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

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

Controlador:

No topo :

using Microsoft.Extensions.Configuration;

No seu código:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];
Alexander S.
fonte
Bem direto. Obrigado por isso, você me ajudou!
Matt
AddJsonFile não existe no ConfigurationBuilder
Essej
10

O seguinte funciona para aplicativos de console;

  1. Instale os seguintes pacotes 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. Crie appsettings.jsonno nível raiz. Clique com o botão direito do mouse e em "Copiar para Diretório de Saída" como " Copiar, se mais recente ".

  3. Arquivo de configuração de amostra:

    {
      "AppConfig": {
        "FilePath": "C:\\temp\\logs\\output.txt"
      }
    }
  4. Program.cs

    configurationSection.Keye configurationSection.Valueterá propriedades de configuração.

    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);
        }
    }
Teoman shipahi
fonte
8

Para o .NET Core 2.0, você pode simplesmente:

Declare seus pares de chave / valor em appsettings.json:

{
  "MyKey": "MyValue"
}

Injete o serviço de configuração em startup.cs e obtenha o valor usando o serviço

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);
        });
Chris Halcrow
fonte
8

Duvido que seja uma boa prática, mas está funcionando localmente. Eu atualizarei isso se falhar quando publicar / implantar (em um serviço da Web IIS).

Etapa 1 - Adicione este assembly ao topo da sua classe (no meu caso, classe de controlador):

using Microsoft.Extensions.Configuration;

Etapa 2 - adicione isto ou algo parecido:

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

Etapa 3 - Chame o valor da sua chave fazendo isso (retorna string):

config["NameOfYourKey"]
Eric Milliot-Martinez
fonte
Eu acho que isso deve ficar bem desde que appsettings.jsonesteja no diretório certo
Ju66ernaut
7

Apenas para complementar a resposta de Yuval Itzchakov.

Você pode carregar a configuração sem a função do construtor, basta injetá-la.

public IConfiguration Configuration { get; set; }

public Startup(IConfiguration configuration)
{
   Configuration = configuration;
}
Tiago Barroso
fonte
6

Além das respostas existentes, gostaria de mencionar que, às vezes, pode ser útil ter métodos de extensão paraIConfiguration por causa da simplicidade.

Eu mantenho a configuração do JWT em appsettings.json para que minha classe de métodos de extensão seja a seguinte:

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

Isso economiza muitas linhas e você apenas escreve um código limpo e mínimo:

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

Também é possível registrar uma IConfigurationinstância como singleton e injetá-la onde você precisar - eu uso o contêiner Autofac, veja como você faz isso:

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

Você pode fazer o mesmo com o MS Dependency Injection:

services.AddSingleton<IConfigurationRoot>(appConfiguration);
Alex Herman
fonte
6

Aqui está o caso de uso completo do 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>
Alper Ebicoglu
fonte
"ASP.NET Core" Qual versão?
9788 Steve
5

Eles continuam mudando as coisas - tendo acabado de atualizar o Visual Studio e tendo a bomba do projeto inteira, no caminho da recuperação e a nova maneira é assim:

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

Eu continuava perdendo essa linha!

.SetBasePath(env.ContentRootPath)
Código monolítico
fonte
1
Como podemos obter os valores de AppSettings em projetos de teste usando a mesma abordagem?
precisa saber é o seguinte
2
They just keep changing things. Este. Quase todas as respostas nesta página se aplicam apenas a uma versão específica do .Net Core.
Steve Smith
4

.NET Core 2.1.0

  1. Crie o arquivo .json no diretório raiz
  2. No seu código:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. Instale as seguintes dependências:

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

4. Em seguida, IMPORTANTE: Clique com o botão direito do mouse no arquivo appsettings.json -> clique em Propriedades -> selecione Copiar se for mais recente: insira a descrição da imagem aqui

  1. Finalmente, você pode fazer:

    config ["chave1"]

Considerando que meu arquivo de configuração ficará assim:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}
Gregory
fonte
2

Você pode tentar o código abaixo. Isso está funcionando para mim.

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

Aqui eu criei uma classe para obter as configurações de cadeia de caracteres e aplicativos de conexão.

No arquivo Startup.cs, você precisa registrar a classe como abaixo.

public class Startup
{

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        Settings.Configure(httpContextAccessor);
    }
}
jishan siddique
fonte
2

Para o ASP.NET Core 3.1, você pode seguir esta documentação:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

Ao criar um novo projeto do ASP.NET Core 3.1, você terá a seguinte linha de configuração Program.cs:

Host.CreateDefaultBuilder(args)

Isso permite o seguinte:

  1. ChainedConfigurationProvider: adiciona uma configuração ICon existente como fonte. No caso da configuração padrão, adiciona a configuração do host e a define como a primeira fonte para a configuração do aplicativo.
  2. appsettings.json usando o provedor de configuração JSON.
  3. appsettings.Environment.json usando o provedor de configuração JSON. Por exemplo, appsettings.Production.json e appsettings.Development.json.
  4. Segredos do aplicativo quando o aplicativo é executado no ambiente de desenvolvimento.
  5. Variáveis ​​de ambiente usando o provedor de configuração Variáveis ​​de Ambiente.
  6. Argumentos de linha de comando usando o provedor de configuração de linha de comando.

Isso significa que você pode injetar IConfiguration e buscar valores com uma chave de cadeia, mesmo valores aninhados. GostarIConfiguration ["Parent:Child"];

Exemplo:

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
fonte
@Ogglas ... como o chamador de WeatherForecastController () poderia obter a classe que implementa a configuração ICon?
Johnny Wu
1

Isso foi "trapaça"? Acabei de tornar minha configuração na classe Startup estática e posso acessá-la de qualquer outro lugar:

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
fonte
1

Coloque-o dentro do controlador como um objeto por chamada Get<YourType>():

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

Primeiro, você deve injetar a configuração ICon e, em seguida, para ler as configurações de aplicativos, você pode usar um destes métodos:

  1. Obter dados de uma seção

    var redisConfig = configuration.GetSection("RedisConfig");
  2. Obter um valor dentro de uma seção

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. Obter valor aninhado na seção

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");
Hamed Naeemaei
fonte
Injetar funciona para controladores, mas e se eu quiser usá-lo no Middleware como aqui ? Por exemplo, estou usando o Redis como middleware para armazenar em cache as respostas http.
Alexander Ryan Baggett
1

A maneira do .NET Core 2.2

(Sem dúvida, a Microsoft mudará novamente para algo completamente diferente na próxima versão do .NET.)

1. appSettings.json

Pode parecer algo assim. Aqui estaremos carregando o Setting1 e o Setting2

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

2. AppSettings.cs

A classe POCO para armazenar Configuração1 e Configuração2. Nós estaremos carregando o appsettings.json neste objeto de classe. A estrutura da classe POCO deve corresponder ao arquivo JSON; as propriedades podem ser aninhadas em outras propriedades / classes, se desejado.

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

3 Startup.cs

Carregue appSettings.json no objeto AppSettings e comece a usá-lo:

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;
    }
user1321471
fonte
0

Com a mais recente iteração do netcoreapp 3.1, você pode fazer isso de maneira simples, sem dependências de terceiros.

Eu criei uma essência para isso , mas você pode usar essa classe para ler um arquivo JSON e retornar propriedades dinâmicas.

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

Fiz isso especificamente para poder usar um appconfig.json no meu aplicativo de console do dotnet. Eu apenas coloquei isso na minha Program.Mainfunção:

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

E isso retornará um dynamicobjeto para a propriedade. (Um JsonElement se não for um primitivo). Meu appsettings.jsonarquivo fica assim:

{
  "Environment": {
    "Token": "abc-123",
    "Name": "Production"
  }
}
Justin Gilman
fonte