首页 > 解决方案 > 在自托管的 .net core 2.2 应用程序上正确使用 IsDevelopement()

问题描述

我有一个自托管的 .NET core 2.2 控制台应用程序,它不使用 Web 主机生成器,因为我不需要此服务的 HTTP 端点。

我试图通过IsDevelopment()托管环境的方法来利用环境变量,但它总是以Production的形式返回。

以下是我设置主机构建器的方式。我有一个名为DevelopmentASPNETCORE_ENVIRONMENT的环境变量,这让我问了两个问题。

  1. 在构建我自己的主机时设置此设置的正确方法是什么,以便我可以在构建主机时有条件地将用户机密添加到我的配置中?
  2. 第二个问题是我是否可以使用其他环境变量,ASPNETCORE_ENVIRONMENT因为我的应用程序不是 ASP.NET 核心应用程序?

我意识到我可能会在构建HostBuilder显式查找环境变量并手动设置环境之前编写代码,但是 ASP.NET Core 似乎在幕后挂钩,所以我想看看是否有办法获得当我不使用网络主机生成器时,类似的行为。

private static IHost BuildEngineHost(string[] args)
{
    var engineBuilder = new HostBuilder()
        .ConfigureAppConfiguration((hostContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            config.AddEnvironmentVariables();
            if(hostContext.HostingEnvironment.IsDevelopment())
                config.AddUserSecrets<EngineOptions>();
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.Configure<EngineOptions>(hostContext.Configuration.GetSection("EngineOptions"));
            services.AddHostedService<EtlEngineService>();
        })
        .ConfigureLogging((hostContext, logging) =>
        {
            logging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
        });
    return engineBuilder.Build();
}

更新:在配置应用程序之前需要配置主机

.ConfigureHostConfiguration(config =>
{
    config.AddCommandLine(args);
    config.AddEnvironmentVariables();
})

这在 .ConfigureAppConfiguration() 之前调用,并从任何名为“Environment”的变量加载,这意味着我不必使用 ASPNET_ENVIRONMENT。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.2

标签: c#.net-core.net-core-2.2.net-core-configuration

解决方案


我能够通过在 AppConfiguration 之前调用 ConfigureHostConfiguration() 来使用正确的值初始化托管环境,这可以正确设置主机中的环境值,这是我在 Microsoft 的以下文档中遇到的。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.2

private static IHost BuildEngineHost(string[] args)
{
    var engineBuilder = new HostBuilder()
        .ConfigureHostConfiguration(config =>
        {
            config.AddEnvironmentVariables();
            config.AddCommandLine(args);
        })
        .ConfigureAppConfiguration((hostContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            config.AddEnvironmentVariables();
            if(hostContext.HostingEnvironment.IsDevelopment())
                config.AddUserSecrets<EngineOptions>();
        })
        .ConfigureServices((hostContext, services) =>
        {
            services.Configure<EngineOptions>(hostContext.Configuration.GetSection("EngineOptions"));
            services.AddHostedService<EtlEngineService>();
        })
        .ConfigureLogging((hostContext, logging) =>
        {
            logging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
        });
    return engineBuilder.Build();
}

推荐阅读