appsettings.json

Quando você cria um projeto no ASP.NET Core, vem um arquivo chamado appsettings.json. Ele é mais simples do que o antigo e complicado web.config que a Microsoft usava. Apesar de o ASP.NET Core suportar JSON, XML e ini, JSON é o preferido.

No passado, tudo era configurado no Startup.cs, mas no .NET 6, isso foi simplificado no Program.cs com este comando:

var builder = WebApplication.CreateBuilder(args); 

Os detalhes importam

Veja como o WebHost monta a configuração:

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

    if (env.IsDevelopment())
    {
        var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
        if (appAssembly != null)
        {
            config.AddUserSecrets(appAssembly, optional: true);
        }
    }

    config.AddEnvironmentVariables();

    if (args != null)
    {
        config.AddCommandLine(args);
    }
}

Cuidado com a variável env.EnvironmentName, configurada em ASPNETCORE_ENVIRONMENT, que pode estar no launchSettings.json ou no sistema operacional. Em Development, os User Secrets são ativados para guardar senhas de banco.

Camadas do appsettings

O appsettings tem várias camadas:

  1. appsettings.json.
  2. appsettings.Development.json.
  3. User Secrets.
  4. Variáveis de ambiente.
  5. Argumentos da linha de comando.

Níveis (Hierarquia)

Cada camada pode sobrescrever a anterior, permitindo configurações específicas para cada ambiente.

User Secrets

Use User Secrets para guardar senhas na sua máquina sem colocá-las no git.

Como usar o User Secrets?

No projeto, escolha Manage User Secrets. Ele salva tudo na máquina local.

Compartilhando User Secrets

Para usar em outros projetos:

<UserSecretsId>id</UserSecretsId>

Variáveis de ambiente

ASPNETCORE_ENVIRONMENT pode ser Development, Staging, Production ou outro valor. No Linux, a capitalização importa.

Quer modificar o appsettings? Fácil. Por exemplo, no appsettings.json:

{
  "EmailParaEnviarErro": "[email protected]"
}

Uma variável de ambiente pode mudá-lo.

Docker

No Dockerfile:

ENV ASPNETCORE_ENVIRONMENT=Production

No Compose:

environment: 
      ASPNETCORE_ENVIRONMENT: Development
      ApplicationSettings:EnableExternalProviders: "false"

Kubernetes

No Kubernetes, configure as variáveis de ambiente do deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: minha-aplicacao
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: minha-aplicacao-container
        image: meu-repositorio/minha-aplicacao:latest
        env:
        - name: ApplicationSettings__OneMoreLevel__3rdLevel
          value: "Mudado pelo Kubernetes"

Azure AppService

Para alterar as configurações no Azure, vá em App Services > Seu App Service > Configuration.

Alterando subníveis

No appsettings.json:

{
  "ApplicationSettings": {
    "OneMoreLevel": {
      "3rdLevel": "data"
    }
  }
}

No Docker Compose:

environment: 
    ApplicationSettings:OneMoreLevel:3rdLevel: "Changed!"

No Azure, Windows permite dois pontos (:), mas no Linux use underline duplo (__).

Bônus: Consultar variáveis no Azure AppService

Vá em Advanced Tools > Go e confira em Environment no Kudu.