在 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”(在同一命令提示符中)之前的命令提示符中运行它,或者添加到“我的电脑”环境变量(对于当前机器上的所有应用程序),或intolaunchSettings
(从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.json
与appsettings.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