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

Posted

技术标签:

【中文标题】在 ASP.NET Core 中读取环境变量【英文标题】:Read environment variables in ASP.NET Core 【发布时间】:2016-05-23 09:23:55 【问题描述】:

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

set ASPNET_ENV = Production
dnx web

在 1.0 中使用相同的方法:

set ASPNETCORE_ENVIRONMENT = Production
dotnet run

不起作用 - 应用程序似乎无法读取环境变量。

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

返回空值

我错过了什么?

【问题讨论】:

我在系统和用户下添加了一个环境变量,但是当我将它们全部拉出时,我看不到我添加的那个。这只适用于生产环境吗? 【参考方案1】:

您的问题是= 周围的空格。

这会起作用(在结束引号之前注意空格):

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

此代码中ASPNETCORE_ENVIRONMENT 后面的空格不是错字!问题中的问题是有额外的空间(在 SET... 中),因此您必须在 GetEnvironmentVariable() 中使用相同的空间。

正如Isantipov in a comment 所述,更好的解决方案是从 SET 命令中完全删除空格:

set ASPNETCORE_ENVIRONMENT=Production

【讨论】:

Dmitry,我们应该在 CommandPrompt 中哪里执行这个“SET”命令?? Aswartha,这取决于您的机器/场景。如果从命令提示符开始,您可以在“dotnet run”(在同一命令提示符中)之前的命令提示符中运行它,或者添加到“我的电脑”环境变量(对于当前机器上的所有应用程序),或into launchSettings(从VS),或在 Azure 中运行时进行 WebApp 配置。 好的,如果我们将= 符号或空格 ` ` 作为环境变量值的一部分会发生什么?我们应该如何分配/获取这些? 如果您的值中有“奇怪”字符 - 没问题。打开命令提示符,运行set myvar=bla=bla bla,然后运行echo %myvar% - 你会看到bla=bla bla 你不会想要使用 'ASPNETCORE_ENVIRONMENT '(带有尾随空格) - aspnet 核心中有一些功能取决于 'ASPNETCORE_ENVIRONMENT' 的值(没有尾随空格) - 例如解决 appsettings.Development.json vs appsettings.Production.json。 (我添加了一些太长的细节,无法在此处发表评论:***.com/a/47884810/1990682)【参考方案2】:

这应该是@Dmitry 对this answer 的评论(但太长了,因此我将其作为单独的答案发布):

您不想使用'ASPNETCORE_ENVIRONMENT '(带有尾随空格) - ASP.NET Core 中的某些功能取决于 'ASPNETCORE_ENVIRONMENT'(无尾随空格)的值 - 例如解决appsettings.Development.jsonappsettings.Production.json。 (例如见Working with multiple environments documentation article

而且我想如果你想完全停留在 ASP.NET Core 范式中,你会想使用IHostingEnvironment.Environment(参见documentation)属性而不是直接从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);
        //<...>
    

    //<...>

【讨论】:

你能在Startup.cs中读到Environment.GetEnvironmentVariable吗?我正在寻找一个特定的机器值 @djack109 我认为你应该可以,除非 dotnet core 以某种方式特别阻止它。【参考方案3】:

如果您在开发过程中在运行时创建环境变量,那么您每次都会得到 null。您必须重新启动 Visual Studio,因为 VS 仅在启动时读取 EV。

【讨论】:

以上是关于在 ASP.NET Core 中读取环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 docker-compose 环境变量不起作用 ASP.Net Core MVC

asp.net core环境变量详解

ASP.NET Core 托管环境变量被忽略

如何使用环境变量覆盖 ASP.NET Core 配置数组设置

ASP.NET Core学习——7

ASP .NET CORE 根据环境变量支持多个 appsettings.json