在ASP.NET Core中读取环境变量

105

使用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

我缺少了什么?


我已经在系统和用户下添加了一个环境变量,但是当我拉取它们时,我没有看到我添加的那个。这只在生产环境中有效吗? - Daniel Jackson
3个回答

173
您的问题是在等号周围有空格。
以下的写法是正确的(注意引号前的空格):
Console.WriteLine(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT "));

在这段代码中,ASPNETCORE_ENVIRONMENT后面的空格并不是笔误!问题在于SET命令中有额外的空格,因此在GetEnvironmentVariable()中必须使用相同的空格。

正如Isantipov在评论中指出的那样,更好的解决方案是完全从SET命令中去除空格:

set ASPNETCORE_ENVIRONMENT=Production

1
Dmitry,我们应该在哪里执行这个“SET”命令...在命令提示符中吗? - Aswartha
1
Aswartha,这取决于您的机器/场景。如果从命令提示符开始,则可以在“dotnet run”之前在命令提示符中运行此命令(在同一命令提示符中),或将其添加到“My Computer”环境变量(适用于当前计算机上的所有应用程序),或添加到launchSettings(从VS启动时),或在Azure中运行时添加到WebApp配置中。 - Dmitry
好的,如果环境变量值中包含 = 或空格 ,我们该怎么办?我们应该如何分配/获取它们? - nicks
2
如果您的值中有“奇怪”的字符 - 没问题。打开命令提示符,运行 set myvar=bla=bla bla 然后运行 echo %myvar% - 您将看到 bla=bla bla - Dmitry
3
您不希望使用“ASPNETCORE_ENVIRONMENT”(带有尾随空格)- 因为 aspnet core 中的某些特性取决于“ASPNETCORE_ENVIRONMENT”(没有尾随空格)的值,例如解析 appsettings.Development.json 和 appsettings.Production.json。(我还添加了一些详细信息,过长无法在此处发布:https://dev59.com/-loU5IYBdhLWcg3wg3EI#47884810) - Isantipov
它适用于NetCore 3.1。 - JRichardsz

28

这实际上应该是对此答案的评论,由@Dmitry提供(但是太长了,因此我将其作为单独的答案发布):

您不想使用'ASPNETCORE_ENVIRONMENT '(带有尾随空格)- 因为 ASP.NET Core 中有一些功能取决于'ASPNETCORE_ENVIRONMENT' 的值 - 例如解析 appsettings.Development.json appsettings.Production.json 。(例如,请参见多个环境的工作文档文章

而且,我认为,如果您想完全保持在 ASP.NET Core 范例内,您需要使用IHostingEnvironment.Environment(请参见文档)属性来替代直接从Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")读取(尽管前者当然由后者设置)。例如,在 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);
        //<...>
    }

    //<...>
}

1
你能在 Startup.cs 中读取 Environment.GetEnvironmentVariable 吗?我正在寻找特定的机器值。 - djack109
@djack109 我认为你应该可以做到,除非dotnet core以某种特定方式阻止它。 - Tanveer Badar

6
如果你在开发过程中动态创建环境变量,那么每次都会得到null值。因为Visual Studio只在启动时读取环境变量,所以你需要重新启动它。

1
我在看了你的消息后才意识到我的错误。非常感谢@Umer Waheed。 - Ashok kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接