read net from data asp c# asp.net-core appsettings

c# - from - ¿Configurar automáticamente appsettings.json para los entornos de desarrollo y lanzamiento en el núcleo de asp.net?



net core read configuration (6)

He definido algunos valores en mi appsettings.json para cosas como cadenas de conexión de bases de datos, ubicaciones de webapi y similares que son diferentes para el desarrollo, la puesta en escena y los entornos en vivo.

¿Hay una manera de tener múltiples archivos appsettings.json (como appsettings.live.json , etc, etc.) y tener la aplicación asp.net simplemente ''saber'' cuál usar de acuerdo con la configuración de compilación que se está ejecutando?


En ASP.NET Core, debería usar EnvironmentVariables en lugar de la configuración de compilación para las aplicaciones adecuadas.

Haga clic derecho en su proyecto> Propiedades> Depurar> Variables de entorno

ASP.NET Core tomará el archivo appsettings.json adecuado.

Ahora puedes usar esa Variable de Ambiente así:

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

Si lo haces a la manera de @Dmitry, tendrás problemas, por ejemplo. al anular los valores de appsettings.json en Azure.


He agregado una instantánea del entorno de trabajo, porque me cuesta varias horas para I + D.

Primero agrega la clave a tu archivo Launch.Json .

Ver a continuación snap, he añadido "Development" como mi entorno.

Luego, agregue el archivo de configuración de aplicaciones con el mismo nombre en su proyecto.

Añadido snap, busque 2 archivos diferentes nombrados con.

  • appSettings.Development.Json
  • appSetting.json

Y finalmente, configúralo a tu clase de inicio, como abajo.

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

Y por fin lo estoy ejecutando desde la terminal. Así.

dotnet run --environment "Desarrollo"

Donde el desarrollo es mi entorno.


Puede agregar el nombre de la configuración como ASPNETCORE_ENVIRONMENT en el launchSettings.json como se muestra a continuación

"iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:58446/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "environmentVariables": { ASPNETCORE_ENVIRONMENT": "$(Configuration)" } } }


Puede hacer uso de las variables de entorno y la clase ConfigurationBuilder en su constructor de Startup esta manera:

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(); this.configuration = builder.Build(); }

Luego, crea un archivo appsettings.xxx.json para cada entorno que necesite, con "xxx" como el nombre del entorno. Tenga en cuenta que puede colocar todos los valores de configuración global en su archivo "normal" appsettings.json y solo colocar las cosas específicas del entorno en estos nuevos archivos.

Ahora solo necesita una variable de entorno llamada ASPNETCORE_ENVIRONMENT con algún valor de entorno específico ("live", "staging", "production", lo que sea). Puede especificar esta variable en la configuración de su proyecto para su entorno de desarrollo y, por supuesto, también debe establecerla en sus entornos de producción y de transición. La forma en que lo hagas depende del tipo de entorno que sea.

ACTUALIZACIÓN: Me acabo de dar cuenta de que desea elegir el appsettings.xxx.json función de su configuración de compilación actual. Esto no se puede lograr con mi solución propuesta y no sé si hay una manera de hacerlo. Sin embargo, la forma de "variable de entorno" funciona y podría ser una buena alternativa a su enfoque.


Puedes usar la compilación condicional:

public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) #if SOME_BUILD_FLAG_A .AddJsonFile($"appsettings.flag_a.json", optional: true) #else .AddJsonFile($"appsettings.no_flag_a.json", optional: true) #endif .AddEnvironmentVariables(); this.configuration = builder.Build(); }


Solo una actualización para los usuarios de .NET core 2.0, puede especificar la configuración de la aplicación después de la llamada a CreateDefaultBuilder :

public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration(ConfigConfiguration) .UseStartup<Startup>() .Build(); static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config) { config.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("config.json", optional: false, reloadOnChange: true) .AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); } }