如何在ConfigureServices中获得开发/暂存/生产托pipe环境

如何在启动时在ConfigureServices方法中获得开发/暂存/生产托pipe环境?

 public void ConfigureServices(IServiceCollection services) { // Which environment are we running under? } 

ConfigureServices方法只需要一个IServiceCollection参数。

您可以在ConfigureServices中轻松访问它,只需在Startup方法中将其保存到一个属性中,该方法首先被调用并传入,然后就可以从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... } 

TL; DR

使用环境名称(例如Production )设置名为ASPNETCORE_ENVIRONMENT的环境variables。 然后做两件事之一:

  • IHostingEnvironment注入Startup.cs ,然后使用( env here)来检查: env.IsEnvironment("Production")不要检查使用env.EnvironmentName == "Production"
  • 使用单独的Startup类或单独的Configure / ConfigureServicesfunction。 如果一个类或函数匹配这些格式,将使用它们而不是该环境上的标准选项。
    • Startup{EnvironmentName}() (整个类) || 例如: StartupProduction()
    • Configure{EnvironmentName}() || 例如: ConfigureProduction()
    • Configure{EnvironmentName}Services() || 例如: ConfigureProductionServices()

完整的解释

.NET Core文档描述了如何完成这个 。 使用一个名为ASPNETCORE_ENVIRONMENT的环境variables设置为您想要的环境,然后您有两个select。

检查环境名称

从文档 :

IHostingEnvironment服务提供了用于处理环境的核心抽象。 该服务由ASP.NET托pipe层提供,可以通过dependency injection注入到启动逻辑中。 Visual Studio中的ASP.NET Core网站模板使用此方法来加载特定于环境的configuration文件(如果存在)并自定义应用程序的error handling设置。 在这两种情况下,通过调用IsEnvironment实例传递给适当的方法的EnvironmentNameIsEnvironment引用当前指定的环境来实现此行为。

注: build议检查env.EnvironmentName的实际值!

如果您需要检查应用程序是否在特定环境中运行,请使用env.IsEnvironment("environmentname")因为它将正确地忽略大小写(而不是检查env.EnvironmentName == "Development" )。

使用单独的课程

从文档 :

当ASP.NET Core应用程序启动时, Startup类将用于引导应用程序,加载其configuration设置等( 了解有关ASP.NET启动的更多信息 )。 但是,如果存在一个名为Startup{EnvironmentName} (例如StartupDevelopment ),并且ASPNETCORE_ENVIRONMENT环境variables与该名称匹配,则将使用该Startup类。 因此,您可以configurationStartup进行开发,但有一个单独的StartupProduction ,将在应用程序在生产中运行时使用。 或相反亦然。

除了使用基于当前环境的完全独立的Startup类以外,还可以调整应用程序在Startup类中的configuration方式。 Configure()ConfigureServices()方法支持类似于Startup类本身的环境特定版本,格式为Configure{EnvironmentName}()Configure{EnvironmentName}Services() 。 如果您定义了一个方法ConfigureDevelopment() ,则在环境设置为开发时,将调用它而不是Configure() 。 同样,在相同的环境中,将调用ConfigureServices()而不是ConfigureServices()

宿主环境来自ASPNET_ENV环境variables,在启动期间使用IHostingEnvironment.IsEnvironment扩展方法可用,或者IsDevelopment或IsProduction的相应便利方法之一。 在Startup()或ConfigureServices调用中保存所需内容:

 var foo = Environment.GetEnvironmentVariable("ASPNET_ENV"); 

.NET Core 2.0 MVC应用程序/Microsoft.AspNetCore.All v2.0.0中,您可以具有@vaindil所描述的特定于环境的启动类,但是我不喜欢这种方法。

您也可以将IHostingEnvironment注入到StartUp构造函数中。 您不需要在Program类中存储环境variables。

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

在Dotnet Core 2.0中,Startup-constructor只需要一个IConfiguration参数。

  public Startup(IConfiguration configuration) { Configuration = configuration; } 

如何阅读托pipe环境? 我在ConfigureAppConfiguration期间将它存储在Program-class中(使用完整的BuildWebHost而不是WebHost.CreateDefaultBuilder):

 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就像这样在ConfigureServices中读取它:

 public IServiceProvider ConfigureServices(IServiceCollection services) { var isDevelopment = Program.HostingEnvironment.IsDevelopment(); }