如何设置环境名称(IHostingEnvironment.EnvironmentName)?

默认的ASP.NET Core web项目在Startup.cs包含这样的行:

 if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase)) { app.UseBrowserLink(); app.UseErrorPage(ErrorPageOptions.ShowAll); } else { app.UseErrorHandler("/Home/Error"); } 

据我所知,EnvironmentName是处理开发/生产环境的新方法。 但是在发布版本configuration上它不会改变。 那么设置一个不同的EnvironmentName的方法是什么?

我可以想象它应该在“命令”中设置为服务器的参数。

launchsettings.json

在Properties> launchsettings.json

像这样:

  { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:1032/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Production" } }, "WebAppNetCore": { "commandName": "Project", "launchBrowser": true, "launchUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "web": { "commandName": "web", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } } 

RC2之后

那么设置一个不同的EnvironmentName的方法是什么?

设置ASPNETCORE_ENVIRONMENT环境variables。

有很多方法来设置这个环境variables。 这些包括launchSettings.jsonconfiguration文件和其他特定于环境的方法 。 这里有些例子。

从控制台:

 // PowerShell > $env:ASPNETCORE_ENVIRONMENT="Development" // Windows Command Line > SET ASPNETCORE_ENVIRONMENT=Development // Bash > ASPNETCORE_ENVIRONMENT=Development 

从Azure Web App的应用程序设置:

在Azure中设置环境名称

在RC2之前

我可以想象它应该在“命令”中设置为服务器的参数。

那是真实的。 在你的project.json中,添加--ASPNET_ENV production作为服务器的参数。

 "commands": { "web": "Microsoft.AspNet.Hosting --ASPNET_ENV production --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001" } 

现在当你运行dnx . web dnx . web从命令行, ASPNET_ENV将被production

相关的ASP.NET核心托pipe源代码

WebHostBuilder"ASPNETCORE_"WebHostBuilder组合在一起以创build"ASPNETCORE_environment" 。 它也支持旧密钥。

WebHostDefaults.cs

 namespace Microsoft.AspNetCore.Hosting { public static class WebHostDefaults { public static readonly string ApplicationKey = "applicationName"; public static readonly string StartupAssemblyKey = "startupAssembly"; public static readonly string DetailedErrorsKey = "detailedErrors"; public static readonly string EnvironmentKey = "environment"; public static readonly string WebRootKey = "webroot"; public static readonly string CaptureStartupErrorsKey = "captureStartupErrors"; public static readonly string ServerUrlsKey = "urls"; public static readonly string ContentRootKey = "contentRoot"; } } 

WebHostBuilder.cs

 _config = new ConfigurationBuilder() .AddEnvironmentVariables(prefix: "ASPNETCORE_") .Build(); if (string.IsNullOrEmpty(GetSetting(WebHostDefaults.EnvironmentKey))) { // Try adding legacy environment keys, never remove these. UseSetting(WebHostDefaults.EnvironmentKey, Environment.GetEnvironmentVariable("Hosting:Environment") ?? Environment.GetEnvironmentVariable("ASPNET_ENV")); } 

向后兼容性

使用ASPNETCORE_ENVIRONMENT环境variables设置环境密钥。 ASPNET_ENVHosting:Environment仍然受支持,但生成不推荐使用的消息警告。

https://docs.asp.net/en/latest/migration/rc1-to-rtm.html

默认值

默认值是“生产” ,在这里设置。

您可以通过定义名为ASPNET_ENV的环境variables来设置环境。 例如,如果你想发布SET ASPNET_ENV=Release

如果您将ASPNET_ENV=Release作为parameter passing给命令,它也可能工作,但现在我无法检查它。

这是如何实现的: https : //github.com/aspnet/Hosting/blob/217f9ca3d3ccf59ea06e6555820974ba9c3b5932/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs

  1. 在Azure上,只需在Web应用程序configuration页面上设置ASPNET_ENV环境variables即可。

  2. 使用自己的IIS或其他主机提供商 – 修改web.config以包含“web”命令的参数:

     <configuration> <system.webServer> <handlers> <add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" /> </handlers> <httpPlatform processPath="..\approot\web.cmd" arguments="--ASPNET_ENV Development" stdoutLogEnabled="false" stdoutLogFile="..\logs\stdout.log" startupTimeLimit="3600"></httpPlatform> </system.webServer> </configuration> 
  3. 在开发过程中(如果您可以修改源代码),您还可以在项目的根目录下创build一个名为Microsoft.AspNet.Hosting.json的文件,并设置ASPNET_ENVvariables。

    {“ASPNET_ENV”:“testing”}

ASP.NET Core RC2 ,variables名称已被更改为ASPNETCORE_ENVIRONMENT

例如在Windows中,您可以在登台服务器上执行此命令(使用pipe理员权限)

 SETX ASPNETCORE_ENVIRONMENT "Staging" /M 

这只会被执行一次,之后,服务器将永远被视为登台服务器。

当你在该服务器的命令提示符下dotnet run时,你会看到Hosting environment: Staging

如果你认为从这个值到哪里,那么这个时刻是静态的,默认值是发展。

https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs

当你看IHostingEnviromentvariablestypes,那么它是Microsoft.AspNet.Hosting.HostingEnvrioment。

现在有两种方法可以根据dynamicconfiguration进行更改。

  1. 你可以实现IHostingEnvironment接口并使用你自己的types。 您可以从configuration文件中读取值。

  2. 你可以使用接口你可以在这里直接更新这个variables。

     public Startup(IHostingEnvironment env) { // Setup configuration sources. Configuration = new Configuration() .AddJsonFile("config.json").AddEnvironmentVariables(); Configuration.Set("ASPNET_ENV","Your own value"); } 

    如果您查看ConfigureServices中的服务,则默认情况下会列出服务configuration,其中一个是IConfigureHostingEnviroment。 默认的实现是内部类,所以你不能直接访问,但你可以设置上面的关键ASPNET_ENV,它读取该值。

https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs

如果您需要在不更改代码的情况下进行设置,请从项目源文件夹的根目录下的命令提示符处键入:

 set ASPNET_ENV=Debug 

我有同样的问题。 为了独立于环境variables和web.config,我创build了一个.json文件(我称之为envsettings.json ):

 { // Possible string values reported below. // - Production // - Staging // - Development "ASPNETCORE_ENVIRONMENT": "Staging" } 

然后在Program.cs中添加:

 public class Program { public static void Main(string[] args) { var currentDirectoryPath = Directory.GetCurrentDirectory(); var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json"); var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath)); var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString(); var webHostBuilder = new WebHostBuilder() .UseKestrel() .CaptureStartupErrors(true) .UseSetting("detailedErrors", "true") .UseContentRoot(currentDirectoryPath) .UseIISIntegration() .UseStartup<Startup>(); // If none is set it use Operative System hosting enviroment if (!string.IsNullOrWhiteSpace(enviromentValue)) { webHostBuilder.UseEnvironment(enviromentValue); } var host = webHostBuilder.Build(); host.Run(); } } 

如果您更喜欢使用VSfunction(例如VS 2017),则可以在项目属性的“debugging”选项卡中添加环境variables。 例如,在最新的ASP.NET Core版本(在RC2之后),您应该设置ASPNETCORE_ENVIRONMENTvariables。

在这里输入图像说明

因此, launchSettings.json文件将在相应项目的Properties文件夹中创build(或更新),因此将该文件保存到源代码pipe理解决scheme并在开发人员之间共享(与其他解决scheme相反/ SETX命令)

注意:默认情况下,最新的ASP.NET Core将环境设置为Production。 所以,你只需要将ASPNETCORE_ENVIRONMENT设置为VS中的Development来进行debugging(参见上面的截图)。 当然,如果要在临时环境中本地运行代码,则应将ASPNETCORE_ENVIRONMENT设置为“ Staging 。 最后,当您想在生产环境中运行它时,只需删除此variables或将值设置为“ Production

总结一下:只要确保在Debug对话框中使用了DevelopmentStagingProduction值(不是'Dev'或其他),就可以设置环境并使不同的扩展工作。

另请参阅ASP.NET Core的相关源代码:

 namespace Microsoft.AspNetCore.Hosting { /// <summary>Commonly used environment names.</summary> public static class EnvironmentName { public static readonly string Development = "Development"; public static readonly string Staging = "Staging"; public static readonly string Production = "Production"; } } namespace Microsoft.AspNetCore.Hosting { /// <summary> /// Extension methods for <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />. /// </summary> public static class HostingEnvironmentExtensions { /// <summary> /// Checks if the current hosting environment name is "Development". /// </summary> /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param> /// <returns>True if the environment name is "Development", otherwise false.</returns> public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment) { if (hostingEnvironment == null) throw new ArgumentNullException("hostingEnvironment"); return hostingEnvironment.IsEnvironment(EnvironmentName.Development); } /// <summary> /// Checks if the current hosting environment name is "Staging". /// </summary> /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param> /// <returns>True if the environment name is "Staging", otherwise false.</returns> public static bool IsStaging(this IHostingEnvironment hostingEnvironment) { if (hostingEnvironment == null) throw new ArgumentNullException("hostingEnvironment"); return hostingEnvironment.IsEnvironment(EnvironmentName.Staging); } /// <summary> /// Checks if the current hosting environment name is "Production". /// </summary> /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param> /// <returns>True if the environment name is "Production", otherwise false.</returns> public static bool IsProduction(this IHostingEnvironment hostingEnvironment) { if (hostingEnvironment == null) throw new ArgumentNullException("hostingEnvironment"); return hostingEnvironment.IsEnvironment(EnvironmentName.Production); } /// <summary> /// Compares the current hosting environment name against the specified value. /// </summary> /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param> /// <param name="environmentName">Environment name to validate against.</param> /// <returns>True if the specified name is the same as the current environment, otherwise false.</returns> public static bool IsEnvironment(this IHostingEnvironment hostingEnvironment, string environmentName) { if (hostingEnvironment == null) throw new ArgumentNullException("hostingEnvironment"); return string.Equals(hostingEnvironment.EnvironmentName, environmentName, StringComparison.OrdinalIgnoreCase); } } } 

在VsCode中,将以下内容添加到launch.json中

 { "version": "0.2.0", "configurations": [ { ... "env": { "ASPNETCORE_ENVIRONMENT": "Development" } }, ... ] }