我目前正在使用ASP.NET Core 2.2进行开发:
dotnet --info
.NET Core SDK (reflecting any global.json):
Version: 2.2.300
Commit: 73efd5bd87
Runtime Environment:
OS Name: Windows
OS Version: 10.0.17134
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\2.2.300\
并运行:
dotnet myapp.dll --environment=Local
会将我的IHostingEnvironment设置为“ Local”,但我找不到有关--environment的任何正式文档,也找不到该文件是否可以替代ASPNETCORE_ENVIRONMENT环境变量(似乎没有)。
在构建配置,设置日志记录等时,我特别需要在Program.cs中使用此参数,并且不希望在系统范围内使用ASPNETCORE_ENVIRONMENT。
但是似乎在Program.cs中,我将需要手动读取参数(以及缺少参数的句柄),因为直到稍后才设置IHostingEnvironment,而Environment.GetEnvironmentVariable(“ ASPNETCORE_ENVIRONMENT”)显然为NULL。 / p>
当然,我仍然需要处理是否设置了ASPNETCORE_ENVIRONMENT,并适当选择要使用的选项,这就是为什么我需要知道框架的其余部分如何处理--environment参数的原因。所以我可以照做。
答案 0 :(得分:2)
首先,传递--environment
实际上会覆盖ASPNETCORE_ENVIRONMENT
环境变量,至少会影响默认配置设置,并假设您实际上是在使用config来获取值({{ 1}}是由config组成的,因此很重要。
默认情况下,IHostingEnvironment
会在控制台参数之前加载环境变量,控制台参数是其中包含的最后一个配置提供程序。如果您要使用WebHost.CreateDefaultBuilder
进行自定义操作或从头开始构建主机,则可能不再是这种情况。
无论如何,ASP.NET Core所使用的实际环境来自config,但是该值到达了那里。从您的问题中不清楚的是:1)您是否正在做一些会干扰默认行为的自定义操作,以及2)您尝试以何种方式访问和使用不起作用的环境。
通常来说,您要构建主机,然后从主机的服务集合中拉出ConfigureAppConfiguration
。例如:
IHostingEnvironment
但是,如果您需要以public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
var env = host.Services.GetRequiredService<IHostingEnvironment>();
host.Run();
}
之类的方式访问环境,则显然需要寻找另一种方法。对于ConfigureServices
,您实际上可以注入Startup
并在构造函数中使用它设置一个ivar,prop等:
IHostingEnvironment
还可以构建服务集合并将其以这种方式拉出:
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
Environment = environment;
}
此后,您仍然可以继续更改服务集合。请注意,使用这两种方法,从技术上来讲,您并没有获得最终状态:很显然,只有已注册的服务才可用,并且稍后会发生对config之类的更改。但是,对于类似环境名称的结果,结果应该是一致的。
在类似var provider = services.BuildServiceProvider();
var env = provider.GetRequiredService<IHostingEnvironment>();
的地方,有一个重载通过ConfigureAppConfiguration
。您可以直接从该对象访问WebHostBuilderContext
和Configuration
。 HostingEnvironment
等也是如此。
我认为这应该涵盖几乎所有情况。
编辑
所以,我想我终于了解了您面临的问题。首先,您假设应该通过使用字面量ConfigureLogging
来检索“环境”,而不理解为什么在控制台中传递Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
不会对此产生影响。不会的“环境”是根据配置和环境变量确定的,特别是--environment
只是一种可能的来源。传递ASPNETCORE_ENVIRONMENT
将影响控制台参数配置提供程序。环境的唯一可靠来源是--environment
。
第二,我认为您没有在正确的位置或正确的方式添加所需的其他日志记录,或者您可能根本不知道在执行此操作时如何获取环境。如果您希望它在运行IHostingEnvironment
之前可用,则需要使用Startup
,特别是,您需要传递ConfigureLogging
以便获得环境:
WebHostBuilderContext