如何为控制台应用程序设置ASPNETCORE_ENVIRONMENT?

11

我有一个简单的控制台应用程序,其中包含一个托管服务:

    public static async Task Main(string[] args)
    {
        using (var host = Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                // db context
                services.AddEntityFrameworkNpgsql()
                    .AddDbContext<ApplicationDbContext>();

                // hosted services
                services.AddHostedService<ConsumeScopedServiceHostedService>();
                services.AddScoped<ProcessManuallySendings>();

                // services
                services.AddHttpClient<ISendPushService, SendPushService>(x
                    =>
                {
                    x.Timeout = TimeSpan.FromSeconds(65);
                });
            })
            .Build())
        {
            // Start the host
            await host.StartAsync();

            // Wait for the host to shutdown
            await host.WaitForShutdownAsync();
        }
    }
}

它可以与我的数据库一起使用,这意味着它需要连接字符串。我有三个 appsettings.json 文件:

enter image description here

在开发服务器上,我将使用开发环境,在生产服务器上使用生产环境。在我的本地机器上,我将使用本地环境。这很简单。 我将通过ASPNETCORE_ENVIRONMENT(操作系统环境变量)来获取它。
我使用Linux,在我的shell(zsh)配置文件中:

enter image description here

当我在终端输入$ echo $ASPNETCORE_ENVIRONMENT时,显示Local。 但是当我启动我的控制台应用程序时,
$ dotnet run // in the project folder

它正在尝试使用Production环境启动。参见调试输出:

enter image description here

所以如何设置环境?为什么操作系统变量不起作用?

你正在使用哪个版本的 .net core? - Shoejep
@Shoejep 我正在使用最新的3.1版本。 - Aleksej_Shherbak
3个回答

20
根据.Net Core 3.0及以上版本的文档,主机配置信息由以DOTNET_为前缀的环境变量提供(例如 DOTNET_ENVIRONMENT)。
如果这种方式不奏效,您还可以尝试在launchSettings.json文件中像下面这样设置环境变量。
"environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
    "DOTNET_ENVIRONMENT" : "Development"
}

13

在.NET Core 3中,通用主机使用 DOTNET_ 前缀,而不是旧的 ASPNETCORE_ 前缀。


1
在dotnet core 3.1中,如果在Rider中为控制台应用程序设置环境变量,则无论将它们设置在Run/Debug Configuration或LaunchSettings中,ASPNETCORE_ENVIRONMENT和DOTNET_ENVIRONMENT都不起作用。在我的情况下,我正在使用Microsoft.Extensions.Hosting和Microsoft.Extensions.Hosting.Abstractions,并希望正确解析hostEnvironment为“Development”。请注意保留HTML标签。
if (hostEnvironment.IsDevelopment())
{
    optionsBuilder.EnableSensitiveDataLogging();
    optionsBuilder.AddInterceptors(new EfCommandInterceptor());
}

要使其正常工作,我必须创建一个名为ENVIRONMENT的环境变量,并赋予适当的值。
ENVIRONMENT=Development

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接