对于ASP.NET Core3.1应用程序,我偶然发现了一个奇怪的情况: launchSettings.json中定义的environmentVariables没有设置(例如,Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
是null
)。
launchsettings.json看起来如下所示:
{
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60907",
"sslPort": 44364
}
},
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger/index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"MyApp.WebApi": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger/index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}
我正在使用IIS Express
。
我调查或尝试过的事情:
Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"
是"Development"
。IIS Express
内容,但问题仍然相同。我现在唯一的解决办法是在Program.cs中进行本地更改,并确保从未提交过它,但我正在寻找一个真正的解决方案:
string originalEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", originalEnv ?? "Development");
我没有什么办法去尝试了。我假设它与IIS配置有关,但我无法在%userprofile%\My Documents\IISExpress\config\applicationhost.config
中找到与环境变量有关的任何内容
发布于 2021-01-05 03:49:05
要添加@CodeCaster,请回答为什么不能实际检索它,以及幕后发生了什么。是的,您可以使用IWebHostEnvironment
检索所需的内容,但是环境名称不是asp.net核心设置的环境变量,如果您的lauchsettings.json中没有环境变量,它只是简单地读取。
环境有三个阶段:
现在,这里的区别是,Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
总是在进程级别,而并不是,而是在操作系统级别。当然,您可以通过使用GetEnvironmentVariable(String, EnvironmentVariableTarget)
来改变这种情况,但正如@CodeCaster所提到的那样,这不会对您有所帮助。因此,使用IWebHostEnvironment
获取环境名称对您的情况来说应该足够了,但是您可能已经在机器级别设置了DOTNET_ENVIROMENT,所以一定要知道您特别需要什么。
但是
IWebHostEnviroment
如何检索它呢?
这是因为那些“环境名称”不是环境变量。ASP.Net内核确实设置了任何类型的环境变量。相反,它将其定义为一种方式,您可以这样说,这是一个开发环境,这是一个生产环境。它可以从机器或用户环境变量中读取,但是它不会创建任何类型的变量。
所以,在使用IIS时不能读取这些环境变量的原因,首先是因为这些环境变量根本不存在。
而且,IWebHostEnvironment
也不会以某种方式神奇地读取环境变量。他们只是从lauchsettings.json
加载它,所以同样没有环境变量设置。
更具体地说,在源代码中:
hostingEnvironment.EnvironmentName =
options.Environment ??
hostingEnvironment.EnvironmentName;
它要么是通过您定义的选项检索的,如果您没有定义它,那么它将保持不变。
此外,进程环境变量在终止进程后不会持续存在,因此不需要机器重新启动或清除这些变量。(一般性意见)
发布于 2021-01-05 01:21:06
您混淆了操作系统的环境变量和.NET核心运行时环境。他们有相同的名字,其中一个可以晋升到另一个,但他们是不一样的。
launchSettings.json中的环境变量(“运行时环境”或“主机配置值”)不会被提升为操作系统的实际环境变量,后者可以通过Environment.GetEnvironmentVariable()
读取。
您可以通过IHostingEnvironment.Environment
或IWebHostEnvironment.EnvironmentName
读取应用程序的IWebHostEnvironment.EnvironmentName
。
回顾一下:您不应该使用Environment.GetEnvironmentVariable()
从操作系统的环境变量读取ASPNETCORE_ENVIRONMENT
,因为.NET核心环境可以以不同的方式设置。
相反,在主机初始化期间,ASPNETCORE_ENVIRONMENT
环境变量是从操作系统读取的,但是这个值可以通过不同的方式提供,即通过launchSettings.json、..vscode/unch.json或甚至可以通过AddCommandLine(args)
提供,然后:
dotnet run --environment "Staging"
如果有的话,您的Environment.GetEnvironmentVariable()
会报告错误的值。
https://stackoverflow.com/questions/65538919
复制相似问题