如何设置环境名称(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.json
configuration文件和其他特定于环境的方法 。 这里有些例子。
从控制台:
// PowerShell > $env:ASPNETCORE_ENVIRONMENT="Development" // Windows Command Line > SET ASPNETCORE_ENVIRONMENT=Development // Bash > ASPNETCORE_ENVIRONMENT=Development
从Azure Web App的应用程序设置:
在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_ENV
和Hosting: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
-
在Azure上,只需在Web应用程序configuration页面上设置ASPNET_ENV环境variables即可。
-
使用自己的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>
-
在开发过程中(如果您可以修改源代码),您还可以在项目的根目录下创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进行更改。
-
你可以实现IHostingEnvironment接口并使用你自己的types。 您可以从configuration文件中读取值。
-
你可以使用接口你可以在这里直接更新这个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,它读取该值。
如果您需要在不更改代码的情况下进行设置,请从项目源文件夹的根目录下的命令提示符处键入:
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_ENVIRONMENT
variables。
因此, launchSettings.json
文件将在相应项目的Properties文件夹中创build(或更新),因此将该文件保存到源代码pipe理解决scheme并在开发人员之间共享(与其他解决scheme相反/ SETX
命令)
注意:默认情况下,最新的ASP.NET Core将环境设置为Production。 所以,你只需要将ASPNETCORE_ENVIRONMENT
设置为VS中的Development
来进行debugging(参见上面的截图)。 当然,如果要在临时环境中本地运行代码,则应将ASPNETCORE_ENVIRONMENT
设置为“ Staging
。 最后,当您想在生产环境中运行它时,只需删除此variables或将值设置为“ Production
。
总结一下:只要确保在Debug对话框中使用了Development , Staging或Production值(不是'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" } }, ... ] }
- 如何在使用Visual Studio 2013 ASP.NET标识时更改表名称?
- 实体typesApplicationUser不是当前上下文的模型的一部分
- 如何获取当前用户在C#中的时区
- 正则expression式的格式为MMddyy的asp:RegularExpressionValidator(闰年问题)
- Asp.net – 在下拉列表顶部添加空白项目
- 为什么在Windows 2012 Server上Azure部署比在Windows 2008 Server上慢
- 如何将刻度转换为date格式?
- SignalR 2.0错误:无法加载文件或程序集Microsoft.Owin.Security
- 我如何确定jQuery中匹配元素的元素types?