asp.net-core
Configuration de plusieurs environnements
Recherche…
Avoir des appsettings par environnement
Pour chaque environnement, vous devez créer un fichier appsettings distinct. {EnvironmentName} .json:
- appsettings.Development.json
- appsettings.Staging.json
- appsettings.Production.json
Ensuite, ouvrez le fichier project.json et incluez-les dans "include" dans la section "publishOptions". Cela répertorie tous les fichiers et dossiers qui seront inclus lorsque vous publiez:
"publishOptions": {
"include": [
"appsettings.Development.json",
"appsettings.Staging.json",
"appsettings.Production.json"
...
]
}
La dernière étape Dans votre classe de démarrage, ajoutez:
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
dans constructeur où vous définissez les sources de configuration:
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Obtenir / Vérifier le nom de l'environnement à partir du code
Tout ce dont vous avez besoin est une variable de type IHostingEnvironment :
obtenir le nom de l'environnement:
env.EnvironmentNamePrédéfini
Development,StagingenProductionStaging,Productiondes environnements est la meilleure façon d'utiliser des méthodes d'extension de HostingEnvironmentExtensions classeenv.IsDevelopment() env.IsStaging() env.IsProduction()ignorez correctement la casse (une autre méthode d’extension de HostingEnvironmentExtensions :
env.IsEnvironment("environmentname")variante sensible à la casse:
env.EnvironmentName == "Development"
Configuration de plusieurs environnements
Cet exemple montre comment configurer plusieurs environnements avec une configuration d'injection de dépendances différente et des middlewares distincts dans une classe de Startup .
En plus des méthodes public void Configure(IApplicationBuilder app) et public void ConfigureServices(IServiceCollection services) , on peut utiliser Configure{EnvironmentName} et Configure{EnvironmentName}Services pour avoir une configuration dépendante de l'environnement.
L'utilisation de ce modèle évite de mettre beaucoup de logique if/else une seule méthode / classe de Startup et de la garder propre et séparée.
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) { }
}
Si les services Configure{Environmentname} ou Configure{Environmentname}Services ne sont pas trouvés, ils ConfigureServices respectivement Configure ou ConfigureServices .
La même sémantique s'applique également à la classe Startup . StartupProduction sera utilisé lorsque la ASPNETCORE_ENVIRONMENT variable est définie sur la Production et revenir à Startup quand il est Stagging ou le Development
Un exemple complet:
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();
}
}
Afficher le contenu spécifique de l'environnement dans la vue
Il se peut que vous deviez afficher du contenu dans une vue spécifique à un environnement uniquement. Pour atteindre cet objectif, vous pouvez utiliser l' assistant de balise 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'assistant de balise Environment restitue uniquement son contenu si l'environnement actuel correspond à l'un des environnements spécifiés à l'aide de l'attribut names .
Définir la variable d'environnement à partir de la ligne de commande
Pour définir l'environnement au Development
SET ASPNETCORE_ENVIRONMENT=Development
L'exécution d'une application Asp.Net Core se fera désormais dans l'environnement défini.
Remarque
- Il ne devrait y avoir aucun espace avant et après le signe d'égalité
=. - L'invite de commandes ne doit pas être fermée avant d'exécuter l'application car les paramètres ne sont pas conservés.
Définir la variable d'environnement à partir de PowerShell
Lorsque vous utilisez PowerShell, vous pouvez utiliser setx.exe pour définir les variables d'environnement de manière permanente.
Démarrer PowerShell
Tapez l'une des options suivantes:
setx ASPNETCORE_ENVIRONMENT "développement"
setx ASPNETCORE_ENVIRONMENT "mise en scène"
Redémarrer PowerShell
Utiliser ASPNETCORE_ENVIRONMENT depuis web.config
Si vous ne souhaitez pas utiliser ASPNETCORE_ENVIRONMENT à partir de variables d'environnement et l'utiliser depuis web.config de votre application, modifiez le fichier web.config comme ceci -
<aspNetCore processPath=".\WebApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>