Xor*_*ist 4 environment command-line asp.net-core-2.2
我目前正在使用 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\
Run Code Online (Sandbox Code Playgroud)
并运行:
dotnet myapp.dll --environment=Local
Run Code Online (Sandbox Code Playgroud)
会将我的 IHostingEnvironment 设置为“Local”,但我找不到任何关于 --environment 的官方文档以及它是否会覆盖 ASPNETCORE_ENVIRONMENT 环境变量(看起来似乎不会)。
在构建配置、设置日志记录等时,我特别需要在 Program.cs 中使用此参数,并且不希望在系统范围内使用 ASPNETCORE_ENVIRONMENT。
但看来在 Program.cs 中,我需要手动读取参数(以及处理其缺失的情况),因为 IHostingEnvironment 直到稍后才设置,并且 Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") 显然将为 NULL。
当然,我仍然需要处理 ASPNETCORE_ENVIRONMENT 是否已设置,并适当选择要使用的,这就是为什么我需要知道框架的其余部分如何处理 --environment 参数。所以我可以效仿。
首先,传递--environment实际上会覆盖ASPNETCORE_ENVIRONMENT环境变量,至少就默认配置设置而言,并假设您实际上使用 config 来获取值(IHostingEnvironment由 config 组成,因此很重要)。
默认情况下,WebHost.CreateDefaultBuilder在控制台参数之前加载环境变量,这是包含的最后一个配置提供程序。如果您正在做一些定制的事情ConfigureAppConfiguration或从头开始构建您的主机,那么情况可能不再是这样了。
无论如何,ASP.NET Core 使用的实际环境来自配置,但值却到达那里。从您的问题中不清楚的是:1)您是否正在执行一些会干扰默认行为的自定义操作,以及2)您尝试以何种方式访问和使用无法正常工作的环境。
一般来说,您希望构建主机,然后IHostingEnvironment从主机的服务集合中拉出。例如:
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
var env = host.Services.GetRequiredService<IHostingEnvironment>();
host.Run();
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您需要以类似的方式访问环境ConfigureServices,那么显然您需要找到另一种方式。对于Startup,您实际上可以IHostingEnvironment在构造函数中注入并设置 ivar、prop 等:
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
Environment = environment;
}
Run Code Online (Sandbox Code Playgroud)
还可以构建服务集合并以这种方式将其拉出:
var provider = services.BuildServiceProvider();
var env = provider.GetRequiredService<IHostingEnvironment>();
Run Code Online (Sandbox Code Playgroud)
之后您仍可以继续更改服务集合。请注意,使用这两种方法,从技术上讲,您都无法获得最终状态:显然,只有已经注册的服务才可用,并且稍后可能会对配置等内容进行更改。但是,对于环境名称之类的内容,结果应该是一致的。
在类似的情况下ConfigureAppConfiguration,有一个重载传递了WebHostBuilderContext. 您可以直接访问Configuration该HostingEnvironment对象。ConfigureLogging等也同样如此。
我认为这应该涵盖几乎所有场景。
编辑
所以,我想我终于明白你面临的问题了。首先,您假设应该通过字面使用来检索“环境” Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"),但不理解为什么传入--environment控制台不会影响它。不会的。“环境”是根据配置和环境变量确定的,具体来说ASPNETCORE_ENVIRONMENT只是一种可能的来源。传递--environment将影响控制台参数配置提供程序。环境的唯一可靠来源是IHostingEnvironment。
其次,我认为您没有在正确的位置或正确的方式添加所需的额外日志记录,或者您可能只是不知道这样做时如何获取环境。如果您希望它在Startup运行之前可用,那么您需要使用ConfigureLogging,具体来说,您需要传入 ,WebHostBuilderContext以便获取环境:
public static void Main(string[] args)
{
CreateWebHostBuilder(args)
.ConfigureLogging(context =>
{
// define additional logging providers
// get environment via `context.HostingEnvironment`
}).Build().Run();
Run Code Online (Sandbox Code Playgroud)