Transformaciones de configuración en ASP.NET Core

Es muy común que en nuestros proyectos tengamos la necesidad de trabajar con distintos entornos, tales como DEVELOPMENT, QA o PRODUCTION. En estos casos, es de vital importancia que los parámetros de configuración de nuestra aplicación estén correctamente acotados para el entorno correspondiente para evitar sorpresas desagradables. Nadie quiere equivocarse y utilizar la base de datos de producción en el entorno de desarrollo ?.

¿Cómo se definen los entornos en Visual Studio?

Generalmente, cuando creamos una solución de ASP.NET Core (como una WebAPI) se crea el fichero de configuración appsettings.json y su versión de desarrollo: appsettings.Development.json

El entorno de ejecución por defecto en Visual Studio es el entorno de Development. Si queremos cambiar este valor, se hace a través del fichero launchSettings.json ubicado en Properties.

Si queremos definir un nuevo entorno, por ejemplo QA, se deben seguir los siguientes pasos:

1. Creación de appsettings para el entorno

Basta con crear un nuevo archivo, de tipo App Settings File llamado appsettings.qa.json

2. Registrar los ficheros en la clase Startup.cs

Para que la aplicación pueda procesar los nuevos archivos de configuración es necesario indicarle que debe hacer uso de ellos. Para eso, modificamos el constructor para que quede de la siguiente manera:

______

 public Startup(IWebHostEnvironment env)
{
   Configuration = new ConfigurationBuilder()
      .SetBasePath(env.ContentRootPath)
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
      .AddEnvironmentVariables()
      .Build();
}

3.Definir los parámetros que nos interesen en los archivos de configuración

Para este ejemplo, los archivos appsettings.json, appsettings.Development.json y appsettings.qa.json quedarían así:

______

appsettings.json
{}
appsettings.Development.json
{
  "Message": "Hello from Development"
}
appsettings.qa.json
{
  "Message": "Hello from QA"
}


4. Verificación

Para verificar el correcto funcionamiento, crearemos un nuevo controlador para leer y mostrar la configuración de nuestro archivo.

EnvController.cs

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

namespace ConfigTransformations.Controllers
{
   [ApiController]
   [Route("api/[controller]")]
   public class EnvController : ControllerBase
   {
      private readonly IConfiguration _config;

      public EnvController(IConfiguration config)
      {
         _config = config;
      }

      [HttpGet]
      public IActionResult Get()
      {
         return Ok(_config.GetSection("Message").Value);
      }
   }


Al ejecutar nuestra aplicación y acceder a la url: https://localhost:/api/env de-beríamos recibir la siguiente respuesta:

Si queremos ejecutar la solución para el entorno de QA y ver el resultado, lo único que debemos hacer es cambiar el entorno en el fichero launchSettings.json, modificando el parámetro ASPNETCORE_ENVIRONMENT, asignándole el valor “qa”.

launchSettings.json

______
{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
   "windowsAuthentication": false,
   "anonymousAuthentication": true,
   "iisExpress": {
     "applicationUrl": "http://localhost:53609",
     "sslPort": 44342
   }
  },
  "profiles": {
   "IIS Express": {
     "commandName": "IISExpress",
     "launchBrowser": true,
     "launchUrl": "api/env",
     "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "qa"
     }
   },
   "ConfigTransformations": {
     "commandName": "Project",
     "launchBrowser": true,
     "launchUrl": "api/env",
     "applicationUrl": "https://localhost:5001;http://localhost:5000",
     "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "qa"
     }
   }
  }
}

Tras ejecutar la aplicación, el resultado que debemos obtener es el siguiente:

 

En una próxima entrega explicaremos como realizar el despliegue de distintos entornos en Azure App Service.

Escrito por: Daniel Asensio, parte del equipo Bravent.