如何使用通用主机(HostBuilder)为.net核心控制台应用程序设置托管环境名称

时间:2019-09-25 19:13:22

标签: .net-core

我正在将.net core 2.x控制台应用程序设置为Windows服务,并且需要根据环境加载appsettings json文件。我当时在考虑使用标识环境的命令行参数来启动服务。如何在Visual Studio中做到这一点?无论我在项目设置中设置什么,EnvironmentName值始终为“生产”

如何从命令行参数设置环境?

var hostBuilder = new HostBuilder()
                 .UseContentRoot(Directory.GetCurrentDirectory())
                 .ConfigureAppConfiguration((hostingContext, config) =>
                 {
                     var env = hostingContext.HostingEnvironment;
                     config.AddCommandLine(args);
                     config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true);
                     config.AddEnvironmentVariables();
                 })
                 .ConfigureServices((hostContext, services) =>
                 {
                     //Inject additional services as needed
                     services.AddHostedService<JobRunner>();
                });

enter image description here

5 个答案:

答案 0 :(得分:3)

要从环境变量中选择托管环境,您还可以添加:

int StudentsArray::find(int id){
    for(int i = 0; i < studentsCount; ++i){
        if(students[i]->getId() == id){ 
            return i;
        }
    }
    return -1;
}

然后使用.ConfigureHostConfiguration(config => { config.AddEnvironmentVariables(); }) 环境变量传递实际环境。

答案 1 :(得分:3)

Visual Studio 中,您可以在控制台应用程序属性的调试 选项卡下添加环境变量。对于控制台应用程序,环境变量提供者名称必须以 DOTNET_ 为前缀,以便通用主机构建器识别它。在本例中,提供程序名称为 DOTNET_ENVIRONMENT

Visual Studio 2019 image

如果未指定此提供程序名称,则默认为 Production

参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0#host-configuration

答案 2 :(得分:2)

您可以通过ConfigureHostConfiguration扩展方法从命令行变量设置环境。

  

设置构建器本身的配置。这将用于   初始化Microsoft.Extensions.Hosting.IHostEnvironment以供使用   在构建过程的后面。

var hostBuilder = new HostBuilder()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureHostConfiguration(configurationBuilder => {
        configurationBuilder.AddCommandLine(args);
    })
    .ConfigureAppConfiguration((hostingContext, cfg) =>
    {
        // ...

        var env = hostingContext.HostingEnvironment;
        Console.WriteLine(env.EnvironmentName); // Test
        // ...
    });

    // ...

    hostBuilder.Build();

在Visual Studio中,您将应用程序参数配置为与dotnet run使用的参数相同,即{strong> --environment
例如。 dotnet run --environment Test

在没有此应用程序参数的情况下,托管环境默认返回到Production

enter image description here

答案 3 :(得分:2)

另一种方法是直接在主机构建器上使用“UseEnvironnement”方法:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.hostinghostbuilderextensions.useenvironment?view=dotnet-plat-ext-5.0

例如:

   public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseEnvironment("dev") // Magic is here
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseUrls("http://0.0.0.0:8081");
                    webBuilder.UseStartup<Startup>();
                });

答案 4 :(得分:0)

在.net核心控制台应用程序中,要使用环境变量设置主机环境,您需要执行一些步骤。 首先,在HostBuilder中,使用扩展方法 ConfigureHostConfiguration (在 ConfigureAppConfiguration 扩展之前调用)来设置环境变量选项。

 var builder = new HostBuilder();
        builder
        .ConfigureHostConfiguration(config =>
         {
             config.AddEnvironmentVariables(prefix:"DOTNETCORE_");
         })
         .ConfigureAppConfiguration((context, config) =>
         {
             config.AddJsonFile("appsettings.json", optional: false);
             config.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true);
         })

接下来,将环境变量添加到控制台应用程序的属性-调试页面。 Properties - Debug Page screenshot

AddEnvironmentalVariables 中的 prefix :参数告诉代码查找具有该前缀的变量。然后,它使用前缀后面的值来添加变量。

在我的示例中,在我应用的 Properties-Debug 页面中,我添加了一个名为DOTNETCORE_ENVIRONMENT的环境变量,并将其值设置为Development。因此,当调用 ConfigureAppConfiguration 时,上下文的 HostingEnvironment.EnvironmentName 的值为Development。

发布应用程序时,需要确保在主机上设置了相同的环境变量。