asp.net-core
Configurazione di più ambienti
Ricerca…
Avere appettazioni per ambiente
Per ogni ambiente è necessario creare un'app separata. {EnvironmentName} .json files:
- appsettings.Development.json
- appsettings.Staging.json
- appsettings.Production.json
Quindi aprire il file project.json e includerli in "include" nella sezione "publishOptions". Elenca tutti i file e le cartelle che verranno inclusi durante la pubblicazione:
"publishOptions": {
"include": [
"appsettings.Development.json",
"appsettings.Staging.json",
"appsettings.Production.json"
...
]
}
Il passo finale. Nella tua classe di avvio aggiungi:
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
nel costruttore in cui si impostano le fonti di configurazione:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Ottieni / Controlla il nome dell'ambiente dal codice
Tutto ciò di cui hai bisogno è una variabile di tipo IHostingEnvironment
:
ottieni il nome dell'ambiente:
env.EnvironmentName
per gli ambienti di
Development
, gestioneStaging
eProduction
predefiniti, il modo migliore è utilizzare i metodi di estensione dalla classe HostingEnvironmentExtensionsenv.IsDevelopment() env.IsStaging() env.IsProduction()
ignorare correttamente case (un altro metodo di estensione da HostingEnvironmentExtensions :
env.IsEnvironment("environmentname")
variante case sensitive:
env.EnvironmentName == "Development"
Configurazione di più ambienti
Questo esempio mostra come configurare più ambienti con diversa configurazione di Dependency Injection e middleware separati in una classe di Startup
.
Oltre public void Configure(IApplicationBuilder app)
e public void ConfigureServices(IServiceCollection services)
, è possibile utilizzare i servizi Configure{EnvironmentName}
e Configure{EnvironmentName}Services
per avere una configurazione dipendente dall'ambiente.
L'uso di questo modello evita di mettere troppo if/else
logica con un singolo metodo / classe di Startup
e tenerlo pulito e separato.
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) { }
}
Quando i servizi Configure{Environmentname}
o Configure{Environmentname}Services
non vengono trovati, rientrano rispettivamente in Configure
o ConfigureServices
.
La stessa semantica si applica anche alla classe di Startup
. StartupProduction
verrà utilizzato quando la variabile ASPNETCORE_ENVIRONMENT
è impostata su Production
e ricadrà Startup
quando si tratta di Stagging
o di Development
Un esempio 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();
}
}
Rendi visibile il contenuto specifico per l'ambiente
Potrebbe essere necessario rendere visibile del contenuto, che è specifico solo per alcuni ambienti. Per raggiungere questo obiettivo puoi utilizzare l' helper del tag Environment:
<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>
L'helper del tag Environment eseguirà il rendering solo dei suoi contenuti se l'ambiente corrente corrisponde a uno degli ambienti specificati usando l'attributo names
.
Imposta la variabile di ambiente dalla riga di comando
Per impostare l'ambiente per Development
SET ASPNETCORE_ENVIRONMENT=Development
Ora l'esecuzione di un'applicazione Asp.Net Core sarà nell'ambiente definito.
Nota
- Non dovrebbe esserci spazio prima e dopo il segno di uguaglianza
=
. - Il prompt dei comandi non dovrebbe essere chiuso prima di eseguire l'applicazione perché le impostazioni non sono persistenti.
Imposta la variabile di ambiente da PowerShell
Quando si utilizza PowerShell, è possibile utilizzare setx.exe per impostare le variabili di ambiente in modo permanente.
Avvia PowerShell
Digitare uno dei seguenti:
setx ASPNETCORE_ENVIRONMENT "sviluppo"
setx ASPNETCORE_ENVIRONMENT "staging"
Riavvia PowerShell
Utilizzo di ASPNETCORE_ENVIRONMENT da web.config
Se non si desidera utilizzare ASPNETCORE_ENVIRONMENT dalle variabili di ambiente e utilizzarlo da web.config dell'applicazione, quindi modificare web.config in questo modo-
<aspNetCore processPath=".\WebApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>