ChatGPT解决这个技术问题 Extra ChatGPT

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

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

set ASPNET_ENV = Production
dnx web

在 1.0 中使用相同的方法:

set ASPNETCORE_ENVIRONMENT = Production
dotnet run

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

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

返回空

我错过了什么?

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

C
Cody Gray

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

这将起作用(在结束报价之前注意空格):

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

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

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

set ASPNETCORE_ENVIRONMENT=Production

德米特里,我们应该在哪里执行这个“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 与 appsettings.Production .json。 (我添加了一些太长的细节,无法在此处发表评论:stackoverflow.com/a/47884810/1990682
P
Peter Mortensen

这实际上应该是 @Dmitrythis 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 以某种方式特别阻止它。
D
Dharman

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