如何在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
/ConfigureServices
function。 如果一个类或函数匹配这些格式,将使用它们而不是该环境上的标准选项。-
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
实例传递给适当的方法的EnvironmentName
或IsEnvironment
引用当前指定的环境来实现此行为。
注: 不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(); }
- 为什么要创build一个ASP.NET 5类库项目?
- ASP.NET Core中基于令牌的身份validation(刷新)
- 使用ASP.NET Core Web应用程序(.NET Core)与net461设置为唯一框架并使用(.NET Framework)模板之间的区别
- 在ASP.NET Core MVC中select标签助手
- IIS错误502.5上的ASP.NET Core 1.0
- 如何获取部署在Azure网站上的ASP.NET 5应用程序的错误详细信息?
- 发布到IIS,设置环境variables
- ASP.NET vNext是主机不可知的,这是什么意思?
- 找不到与命令“dotnet-aspnet-codegenerator”匹配的可执行文件