读取 ASP.NET 核心中的环境变量

使用 DNX运行我的 ASP.NET Core 应用程序,我能够从命令行设置环境变量,然后像这样运行它:

set ASPNET_ENV = Production
dnx web

在1.0中使用相同的方法:

set ASPNETCORE_ENVIRONMENT = Production
dotnet run

不工作-应用程序似乎不能读取环境变量。

Console.WriteLine(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"));

返回 null

我错过了什么?

138643 次浏览

Your problem is spaces around =.

This will work (attention to space before closing quote):

Console.WriteLine(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT "));

The space after ASPNETCORE_ENVIRONMENT in this code is not a typo! The problem in the question was having extra space (in SET...), so you must use the same space in GetEnvironmentVariable().

As noted by Isantipov in a comment, an even better solution is to remove the spaces entirely from the SET command:

set ASPNETCORE_ENVIRONMENT=Production

This should really be a comment to this answer by @Dmitry (but it is too long, hence I post it as a separate answer):

You wouldn't want to use 'ASPNETCORE_ENVIRONMENT ' (with a trailing space) - there are features in ASP.NET Core which depend on the value of 'ASPNETCORE_ENVIRONMENT'(no trailing space) - e.g. resolving of appsettings.Development.json vs appsettings.Production.json. (e.g. see Working with multiple environments documentation article

And also I guess if you'd like to stay purely inside ASP.NET Core paradigm, you'd want to use IHostingEnvironment.Environment(see documentation) property instead of reading from Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") directly (although the former is of course set from the latter). E.g. in Startup.cs

public class Startup
{
//<...>


// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
Console.WriteLine("HostingEnvironmentName: '{0}'", env.EnvironmentName);
//<...>
}


//<...>
}

If you create the Environment variables at runtime during development then you will get null every time. You have to restart the visual studio because VS read EV at startup only.