在自托管.NET CORE 2.2应用程序上正确使用ISDEVEMENT()



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

我正在尝试通过托管环境的IsDevelopment()方法来利用环境变量,但它总是以生产返回。

以下是我如何设置主机构建器的方式。我有一个称为 ASPNETCORE_ENVIRONMENT的环境变量,其值为 development ,这使我提出两个问题。

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

我意识到在构建明确查找环境变量并手动设置环境的HostBuilder之前,我可能可以编写代码当我不使用Web主机构建器时,获得类似行为的方法。

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((之前调用的,并且是从任何称为"环境"的变量加载的,这意味着我不必使用Aspnet_environment。

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

建立自己的主机时,有什么正确的方法是什么,以便我可以在构建主机时有条件地将用户秘密添加到我的配置中?

正确的方法是不要让您当前在BuildEngineHost方法中拥有的所有代码行。如果您使用的是ASP.NET Core 2.2,那么您编写的那些设置已经为您设置了。在您的Program.cs文件中,您应该只拥有:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

当您在GitHub上查看CreateDefaultBuilder方法实现时,您会看到您要做的事情默认情况下已完成。这是CreateDefaultBuilder的实现:

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
    var builder = new WebHostBuilder();
    if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey)))
    {
        builder.UseContentRoot(Directory.GetCurrentDirectory());
    }
    if (args != null)
    {
        builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());
    }
    builder.ConfigureAppConfiguration((hostingContext, config) =>
    {
        var env = hostingContext.HostingEnvironment;
        config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
              .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
        if (env.IsDevelopment())
        {
            var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
            if (appAssembly != null)
            {
                config.AddUserSecrets(appAssembly, optional: true);
            }
        }
        config.AddEnvironmentVariables();
        if (args != null)
        {
            config.AddCommandLine(args);
        }
    })
    .ConfigureLogging((hostingContext, logging) =>
    {
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
        logging.AddEventSourceLogger();
    }).
    UseDefaultServiceProvider((context, options) =>
    {
        options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
    });
    ConfigureWebDefaults(builder);
    return builder;
}

无论如何,如果您不想使用此实现,那么要回答您的第二个问题,您需要使用此行:

config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

在此行之后:

config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

env变量是一种需要注入BuildEngineHost方法的IHostingEnvironment

我能够通过在appConfiguration之前调用ponfigurehostConfiguration((来初始化托管环境,然后在AppConfiguration之前调用ponfigurehostConfiguration((,该环境正确地设置了我从Microsoft中遇到的主机中的环境值。

https://learn.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();
}

相关内容

  • 没有找到相关文章

最新更新