Gerenciamento de Configurações em .NET Core: Leitura e Atualização de `appsettings.json`

Em aplicações .NET Core, o arquivo appsettings.json é o local padrão para armazenar configurações. Este artigo explora como ler e modificar essas configurações, tanto programaticamente quanto diretamente no arquivo JSON.

Configuração Inicial em Aplicações Web/APIs (Startup.cs / Program.cs)

No contexto de projetos ASP.NET Core, a injeção de dependência via IConfiguration é o método mais comum para acessar as configurações. A construção do objeto de configuração é tipicamente realizada na classe Startup (para versões mais antigas do .NET Core) ou diretamente em Program.cs (para .NET 6+ e superior).


public class Startup
{
    public IConfiguration ConfigApp { get; }

    public Startup(IWebHostEnvironment ambienteWeb)
    {
        ConfigApp = new ConfigurationBuilder()
            .SetBasePath(ambienteWeb.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{ambienteWeb.EnvironmentName}.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
    }
    // ... outros métodos como ConfigureServices, Configure
}

O método .AddJsonFile("nome.json", optional: true, reloadOnChange: true) é crucial, pois permite que o arquivo de configuração seja recarregado automaticamente se houver alterações, sem a necessidade de reiniciar a aplicação. O parâmetro optional: true significa que a ausência do arquivo não causará um erro durante o carregamento.

Configuração em Bibliotecas ou Aplicações Console

Para cenários fora de um host web (como bibliotecas de classe ou aplicações console), você pode construir o objeto de configuração manualmente para carregar as configurações de appsettings.json:


using Microsoft.Extensions.Configuration;
using System.IO;

// ...

var construtorConfig = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile("appsettings.Desenvolvimento.json", optional: true, reloadOnChange: true);

var configuracaoApp = construtorConfig.Build();

// Exemplo de leitura de uma chave:
string valorChaveSecreta = configuracaoApp["JwtSettings:SecretKey"];
// Console.WriteLine($"Chave Secreta: {valorChaveSecreta}");

Este padrão garante flexibilidade para carregar configurações de diversas fontes, incluindo variáveis de ambiente e arquivos JSON específicos do ambiente, mantendo o recurso de recarregamento automático.

Leitura de Valores de Configuração

Utilizando Microsoft.Extensions.Configuration

Uma vez que o objeto IConfiguration (ou configuracaoApp no exemplo da biblioteca) é construído, a leitura dos valores é simples e direta. As chaves são acessadas usando a sintaxe de dois pontos para seções aninhadas:


using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

public class ControleConfiguracao : Controller
{
    private readonly IConfiguration _configuracaoGlobal;

    public ControleConfiguracao(IConfiguration config)
    {
        _configuracaoGlobal = config;
    }

    public IActionResult ObterChaveDeConfig()
    {
        // Assumindo que appsettings.json tenha uma estrutura como {"ConfigGeral": {"ChaveLicenca": "xyz"}}
        string chaveLicenca = _configuracaoGlobal["ConfigGeral:ChaveLicenca"];
        ViewData["InfoConfig"] = $"Valor da Chave de Licença: {chaveLicenca}";
        return View();
    }
}

Este método é o preferido para acessar configurações definidas nos arquivos appsettings.json, pois se integra ao sistema de configuração do .NET Core, que gerencia prioridades entre diferentes fontes e recarregamento automático.

Leitura Direta de Arquivo JSON com Newtonsoft.Json

Em alguns cenários, pode ser necessário ler diretamente o conteúdo de um arquivo JSON que não faz parte do sistema de configuração padrão do .NET ou para realizar uma manipulação mais granular do JSON. Para isso, a biblioteca Newtonsoft.Json é uma ferramenta poderosa.


using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using Microsoft.AspNetCore.Hosting; // Para IWebHostEnvironment
using Microsoft.AspNetCore.Mvc;

public class AnalisadorJsonController : Controller
{
    private readonly IWebHostEnvironment _ambienteWeb;

    public AnalisadorJsonController(IWebHostEnvironment ambienteWeb)
    {
        _ambienteWeb = ambienteWeb;
    }

    public IActionResult LerAppsettingsComNewtonsoft()
    {
        string caminhoArquivoConfig = Path.Combine(_ambienteWeb.ContentRootPath, "appsettings.json");
        string conteudoArquivo = System.IO.File.ReadAllText(caminhoArquivoConfig);
        JObject objetoJson = JObject.Parse(conteudoArquivo);

        // Acessa um valor aninhado
        string chaveServico = (string)objetoJson["ServiceSettings"]["EndpointKey"];

        ViewData["ResultadoLeituraDireta"] = $"Chave do Endpoint (Newtonsoft.Json): {chaveServico}";
        return View();
    }
}

Este método oferece controle total sobre a estrutura JSON, permitindo navegar e extrair qualquer dado de forma programática.

Modificação do Arquivo appsettings.json

A alteração programática do arquivo appsettings.json em tempo de execução deve ser feita com cautela, pois pode sobrescrever formatação existente e remover comentários. Se a alteração for inevitável, Newtonsoft.Json pode ser utilizado para ler, modificar o objeto JSON em memória e então persisitr as alterações de volta ao disco.


using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;

public class GerenciadorConfigController : Controller
{
    private readonly IWebHostEnvironment _ambienteWeb;

    public GerenciadorConfigController(IWebHostEnvironment ambienteWeb)
    {
        _ambienteWeb = ambienteWeb;
    }

    public IActionResult AtualizarChaveNoArquivo()
    {
        string caminhoDoArquivo = Path.Combine(_ambienteWeb.ContentRootPath, "appsettings.json");
        string jsonOriginal = System.IO.File.ReadAllText(caminhoDoArquivo);
        JObject objetoConfig = JObject.Parse(jsonOriginal);

        // Modifica um valor existente ou adiciona um novo.
        // Ex: modificando a chave "LogLevel" dentro de "Logging" -> "LogLevel"
        if (objetoConfig["Logging"] != null && objetoConfig["Logging"]["LogLevel"] != null)
        {
            objetoConfig["Logging"]["LogLevel"]["Default"] = "Warning";
            objetoConfig["Logging"]["LogLevel"]["Microsoft.AspNetCore"] = "Warning";
        }
        else // Se a seção "Logging" ou "LogLevel" não existir, cria-as
        {
            objetoConfig["Logging"] = new JObject(
                new JProperty("LogLevel", new JObject(
                    new JProperty("Default", "Information"),
                    new JProperty("Microsoft.AspNetCore", "Warning")
                ))
            );
        }

        // Escreve o JSON modificado de volta ao arquivo, com indentação para legibilidade
        System.IO.File.WriteAllText(caminhoDoArquivo, objetoConfig.ToString(Formatting.Indented));

        ViewData["StatusModificacao"] = "Configuração do LogLevel atualizada para 'Warning' no arquivo!";
        return View();
    }
}

É importante notar que, embora reloadOnChange: true recarregue o arquivo, a modificação direta pode levar à perda de comentários e à re-formatação do arquivo JSON, impactando a legibilidade para desenvolvedores. Para configurações que mudam frequentemente ou são específicas do usuário, é geralmente mais robusto usar um banco de dados ou um serviço de configuração dedicado, em vez de modificar appsettings.json diretamente.

Tags: dotnetcore appsettingsjson IConfiguration NewtonsoftJson configuracao

Publicado em 5-30 13:26 por Thomas