Comment obtenir l'environnement d'hébergement de développement/intermédiaire/production dans la méthode ConfigureServices
dans Démarrage
public void ConfigureServices(IServiceCollection services)
{
// Which environment are we running under?
}
La méthode ConfigureServices
ne prend qu'un seul paramètre IServiceCollection
.
vous pouvez facilement y accéder dans ConfigureServices, il suffit de la conserver dans une propriété au cours de la méthode de démarrage qui est appelée en premier et qui la transmet, puis vous pouvez accéder à la propriété à partir de ConfigureServices
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
...your code here...
CurrentEnvironment = env;
}
private IHostingEnvironment CurrentEnvironment{ get; set; }
public void ConfigureServices(IServiceCollection services)
{
string envName = CurrentEnvironment.EnvironmentName;
... your code here...
}
Définissez une variable d’environnement appelée ASPNETCORE_ENVIRONMENT
avec le nom de l’environnement (par exemple, Production
). Ensuite, faites l'une des deux choses suivantes:
IHostingEnvironment
dans Startup.cs
, puis utilisez-le (env
ici) pour vérifier: env.IsEnvironment("Production")
. Ne pas vérifier en utilisant env.EnvironmentName == "Production"
!Startup
distinctes ou des fonctions Configure
ConfigureServices
individuelles. Si une classe ou les fonctions correspondent à ces formats, ils seront utilisés à la place des options standard de cet environnement .Startup{EnvironmentName}()
(toute la classe) || exemple: StartupProduction()
Configure{EnvironmentName}()
|| exemple: ConfigureProduction()
Configure{EnvironmentName}Services()
|| exemple: ConfigureProductionServices()
La documentation .NET Core décrit comment procéder . Utilisez une variable d’environnement appelée ASPNETCORE_ENVIRONMENT
définie sur l’environnement souhaité, vous avez alors le choix.
À partir de la documentation :
Le service
IHostingEnvironment
fournit l'abstraction principale pour travailler avec des environnements. Ce service est fourni par la couche d'hébergement ASP.NET et peut être injecté dans votre logique de démarrage via Dependency Injection. Le modèle de site Web ASP.NET Core de Visual Studio utilise cette approche pour charger les fichiers de configuration spécifiques à l’environnement (le cas échéant) et pour personnaliser les paramètres de traitement des erreurs de l’application. Dans les deux cas, ce comportement est obtenu en faisant référence à l'environnement actuellement spécifié en appelantEnvironmentName
ouIsEnvironment
sur l'instance deIHostingEnvironment
transmise à la méthode appropriée.
_/NOTE: Vérifier la valeur actuelle de env.EnvironmentName
n'est pas recommandé!
Si vous devez vérifier si l'application est en cours d'exécution dans un environnement particulier, utilisez
env.IsEnvironment("environmentname")
car elle ignorera correctement la casse (au lieu de vérifier sienv.EnvironmentName == "Development"
par exemple).
À partir de la documentation :
Lorsqu'une application ASP.NET Core démarre, la classe
Startup
est utilisée pour amorcer l'application, charger ses paramètres de configuration, etc. ( en savoir plus sur le démarrage ASP.NET ). Toutefois, s'il existe une classe nomméeStartup{EnvironmentName}
(par exempleStartupDevelopment
) et que la variable d'environnementASPNETCORE_ENVIRONMENT
correspond à ce nom, cette classeStartup
est utilisée à la place. Ainsi, vous pouvez configurerStartup
pour le développement, mais avoir uneStartupProduction
distincte qui serait utilisée lorsque l'application est exécutée en production. Ou vice versa.Outre l'utilisation d'une classe
Startup
entièrement séparée en fonction de l'environnement actuel, vous pouvez également ajuster la configuration de l'application dans une classeStartup
. Les méthodesConfigure()
etConfigureServices()
prennent en charge des versions spécifiques à l'environnement similaires à la classeStartup
elle-même, de la formeConfigure{EnvironmentName}()
etConfigure{EnvironmentName}Services()
. Si vous définissez une méthodeConfigureDevelopment()
, elle sera appelée à la place deConfigure()
lorsque l'environnement est défini sur développement. De même,ConfigureDevelopmentServices()
serait appelé à la place deConfigureServices()
dans le même environnement.
Dans .NET Core 2.0
MVC app/Microsoft.AspNetCore.All
v2.0.0, vous pouvez avoir une classe de démarrage spécifique à l'environnement, telle que décrite par @vaindil mais je n'aime pas cette approche.
Vous pouvez également injecter IHostingEnvironment
dans le constructeur StartUp
. Vous n'avez pas besoin de stocker la variable d'environnement dans la classe Program
.
public class Startup
{
private readonly IHostingEnvironment _currentEnvironment;
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
_currentEnvironment = env;
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
......
services.AddMvc(config =>
{
// Requiring authenticated users on the site globally
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
// Validate anti-forgery token globally
config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
// If it's Production, enable HTTPS
if (_currentEnvironment.IsProduction()) // <------
{
config.Filters.Add(new RequireHttpsAttribute());
}
});
......
}
}
Ceci peut être accompli sans propriétés supplémentaires ni paramètres de méthode, comme ceci:
public void ConfigureServices(IServiceCollection services)
{
IServiceProvider serviceProvider = services.BuildServiceProvider();
IHostingEnvironment env = serviceProvider.GetService<IHostingEnvironment>();
if (env.IsProduction()) DoSomethingDifferentHere();
}
L'environnement d'hébergement provient de la variable d'environnement ASPNET_ENV, disponible au démarrage à l'aide de la méthode d'extension IHostingEnvironment.IsEnvironment, ou de l'une des méthodes pratiques correspondantes d'IsDevelopment ou d'IsProduction. Enregistrez ce dont vous avez besoin dans Startup () ou dans l’appel ConfigureServices:
var foo = Environment.GetEnvironmentVariable("ASPNET_ENV");
par les docs
Configure et ConfigureServices prennent en charge les versions spécifiques à l’environnement de la forme Configure {EnvironmentName} et Configure {EnvironmentName} Services:
Vous pouvez faire quelque chose comme ça ...
public void ConfigureProductionServices(IServiceCollection services)
{
ConfigureCommonServices(services);
//Services only for production
services.Configure();
}
public void ConfigureDevelopmentServices(IServiceCollection services)
{
ConfigureCommonServices(services);
//Services only for development
services.Configure();
}
public void ConfigureStagingServices(IServiceCollection services)
{
ConfigureCommonServices(services);
//Services only for staging
services.Configure();
}
private void ConfigureCommonServices(IServiceCollection services)
{
//Services common to each environment
}
Dans Dotnet Core 2.0, le constructeur de démarrage n'attend qu'un paramètre IConfiguration.
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
Comment lire l’environnement d’hébergement là-bas?
public class Program
{
public static IHostingEnvironment HostingEnvironment { get; set; }
public static void Main(string[] args)
{
// Build web Host
var Host = BuildWebHost(args);
Host.Run();
}
public static IWebHost BuildWebHost(string[] args)
{
return new WebHostBuilder()
.UseConfiguration(new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("hosting.json", optional: true)
.Build()
)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
// Assigning the environment for use in ConfigureServices
HostingEnvironment = env; // <---
config
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureLogging((hostingContext, builder) =>
{
builder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
builder.AddConsole();
builder.AddDebug();
})
.UseIISIntegration()
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
})
.UseStartup<Startup>()
.Build();
}
Ant le lit ensuite dans ConfigureServices comme ceci:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var isDevelopment = Program.HostingEnvironment.IsDevelopment();
}
Je voulais intégrer l'environnement dans l'un de mes services. C'est vraiment facile à faire! Je viens de l'injecter au constructeur comme ceci:
private readonly IHostingEnvironment _hostingEnvironment;
public MyEmailService(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
Maintenant, plus tard dans le code, je peux faire ceci:
if (_hostingEnvironment.IsProduction()) {
// really send the email.
}
else {
// send the email to the test queue.
}
Si vous avez besoin de tester ceci quelque part dans votre base de code qui n'a pas d'accès facile à IHostingEnvironment, un autre moyen simple de le faire est le suivant:
bool isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";