asp.net-core
Configurando entornos múltiples
Buscar..
Tener apariciones por entorno
Para cada entorno, debe crear una configuración de aplicaciones separada. {EnvironmentName} .json files:
- appsettings.Development.json
- appsettings.Staging.json
- appsettings.Production.json
Luego abra el archivo project.json e inclúyalos en "incluir" en la sección "publishOptions". Esto enumera todos los archivos y carpetas que se incluirán cuando publique:
"publishOptions": {
"include": [
"appsettings.Development.json",
"appsettings.Staging.json",
"appsettings.Production.json"
...
]
}
El paso final. En su clase de inicio agregue:
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
en el constructor donde configuras las fuentes de configuración:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Obtener / verificar el nombre del entorno desde el código
Todo lo que necesita es una variable de tipo IHostingEnvironment
:
obtener el nombre del entorno:
env.EnvironmentName
para predefinida
Development
,Staging
,Production
entornos de la mejor manera es utilizar métodos de extensión de HostingEnvironmentExtensions claseenv.IsDevelopment() env.IsStaging() env.IsProduction()
ignorar correctamente el caso (otro método de extensión de HostingEnvironmentExtensions :
env.IsEnvironment("environmentname")
variante sensible a mayúsculas y minúsculas:
env.EnvironmentName == "Development"
Configurando múltiples entornos
Este ejemplo muestra cómo configurar múltiples entornos con diferentes configuraciones de inyección de dependencia y middlewares separados en una clase de Startup
.
Junto con public void Configure(IApplicationBuilder app)
y public void Configure(IApplicationBuilder app)
public void ConfigureServices(IServiceCollection services)
se pueden usar Configure{EnvironmentName}
y Configure{EnvironmentName}Services
para tener una configuración dependiente del entorno.
El uso de este patrón evita poner mucha lógica if/else
dentro de un solo método / clase de Startup
y mantenerlo limpio y separado.
public class Startup
{
public void ConfigureServices(IServiceCollection services) { }
public void ConfigureStaggingServices(IServiceCollection services) { }
public void ConfigureProductionServices(IServiceCollection services) { }
public void Configure(IApplicationBuilder app) { }
public void ConfigureStagging(IApplicationBuilder app) { }
public void ConfigureProduction(IApplicationBuilder app) { }
}
Cuando no se encuentran los Configure{Environmentname}Services
Configure{Environmentname}
o Configure{Environmentname}Services
, volverá a Configure
o ConfigureServices
respectivamente.
La misma semántica también se aplica a la clase de Startup
. StartupProduction
será utilizado cuando el ASPNETCORE_ENVIRONMENT
variable se establece en Production
y se caerá de nuevo a Startup
cuando es Stagging
o Development
Un ejemplo completo:
public class Startup
{
public Startup(IHostingEnvironment hostEnv)
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.SetBasePath(hostEnv.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostEnv.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (hostEnv.IsDevelopment())
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; set; }
// This method gets called by the runtime. Use this method to add services to the container
public static void RegisterCommonServices(IServiceCollection services)
{
services.AddScoped<ICommonService, CommonService>();
services.AddScoped<ICommonRepository, CommonRepository>();
}
public void ConfigureServices(IServiceCollection services)
{
RegisterCommonServices(services);
services.AddOptions();
services.AddMvc();
}
public void ConfigureDevelopment(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseMvc();
}
// No console Logger and debugging tools in this configuration
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseMvc();
}
}
Representar contenido específico del entorno a la vista
Es posible que tenga que mostrar cierto contenido a la vista, que es específico de un entorno solamente. Para lograr este objetivo, puede utilizar el ayudante de etiqueta de entorno:
<environment names="Development">
<h1>This is heading for development environment</h1>
</environment>
<environment names="Staging,Production">
<h1>This is heading for Staging or production environment</h1>
</environment>
El ayudante de la etiqueta Entorno solo representará su contenido si el entorno actual coincide con uno de los entornos especificados utilizando el atributo de names
.
Establecer la variable de entorno desde la línea de comando
Establecer el entorno para el Development
SET ASPNETCORE_ENVIRONMENT=Development
Ahora, ejecutar una aplicación Asp.Net Core estará en el entorno definido.
Nota
- No debe haber espacio antes y después del signo de igualdad
=
. - El símbolo del sistema no debe cerrarse antes de ejecutar la aplicación porque la configuración no se mantiene.
Establecer variable de entorno desde PowerShell
Cuando use PowerShell, puede usar setx.exe para establecer variables de entorno de forma permanente.
Iniciar PowerShell
Escriba uno de los siguientes:
setx ASPNETCORE_ENVIRONMENT "desarrollo"
setx ASPNETCORE_ENVIRONMENT "puesta en escena"
Reinicie PowerShell
Usando ASPNETCORE_ENVIRONMENT desde web.config
Si no desea utilizar ASPNETCORE_ENVIRONMENT de las variables de entorno y utilizarlo desde web.config de su aplicación, modifique web.config como este:
<aspNetCore processPath=".\WebApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>