【问题标题】:How to set hosting environment name for .NET Core console app using Generic Host (HostBuilder)如何使用通用主机 (HostBuilder) 为 .NET Core 控制台应用程序设置托管环境名称
【发布时间】:2019-09-25 19:13:22
【问题描述】:

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

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

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>();
                });

【问题讨论】:

标签: c# .net-core


【解决方案1】:

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

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

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

【讨论】:

  • 我认为可以通过添加一些代码来改进答案: .ConfigureHostConfiguration(configHost => { configHost.AddEnvironmentVariables(prefix: "DOTNET_"); }
  • @RobJohnston 你的评论实际上是这个页面上唯一真正为我回答了这个问题的东西。
【解决方案2】:

要添加上述 pfx 接受的答案,在 Visual Studio 2022 中,可以通过 UI 中的“属性”窗口设置环境变量:

或者设置环境变量:

或者直接编辑Properties下的launchSettings.json文件,添加命令行参数:

【讨论】:

    【解决方案3】:

    您可以通过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 使用的参数相同的参数,即 --environment,
    例如dotnet run --environment Test.

    没有这个应用程序参数,托管环境默认返回Production

    【讨论】:

    • 效果很好。现在我只需要通过 Windows 服务启动参数获取相同的参数。
    • 我偶然发现了很多可能让我畏缩的答案。我很高兴我找到了这个。它工作并且不依赖环境变量或 ASP.NET Core,所以我绝对是最好的答案。
    【解决方案4】:

    如果您将 Visual Studio 2022 与 .Net 5 结合使用,则 UI 可能会有点让人不知所措。在属性下编辑launchSettings.json文件很简单。

    我的看起来如下。请注意其 DOTNET_ENVIRONMENTNOT ASPNETCORE_ENVIRONMENT 用于使用通用主机 (HostBuilder) 的 .NET Core 控制台应用程序

    {
      "profiles": {
        "Bvh.HrSita.DbMigrator": {
          "commandName": "Project",
          "environmentVariables": {
            "DOTNET_ENVIRONMENT": "Development"
          }
        },
        "Bvh.HrSita.DbMigrator.Prod": {
          "commandName": "Project",
          "environmentVariables": {
            "DOTNET_ENVIRONMENT": "Production"
          }
        },
        "Bvh.HrSita.DbMigrator.Stag": {
          "commandName": "Project",
          "environmentVariables": {
            "DOTNET_ENVIRONMENT": "Staging"
          }
        },
        "Docker": {
          "commandName": "Docker"
        }
      }
    }
    

    现在在启动项目时选择您想要的配置文件。以下与 Program.cs 一起显示。

    最后,如果您尝试在 Azure DevOps 管道中运行相同的任务,则任务应如下所示。参数应该有 --environment Production。请注意,添加 env: 在某种程度上按照here的建议为我工作。

        - task: DotNetCoreCLI@2
          displayName: 'Run DbMigrator Project on the newly provisoned database'
          inputs:
            command: run
            projects: '$(Pipeline.Workspace)/$(finalBuildArtifactName)/src/Bvh.HrSita.DbMigrator/Bvh.HrSita.DbMigrator.csproj'
            arguments: '--configuration $(BuildConfiguration) --environment Production'
          env: 
            DOTNET_ENVIRONMENT: Production
    

    【讨论】:

    • 谢谢!使用通用主机 (HostBuilder) 的 .NET Core 控制台应用程序的 DOTNET_ENVIRONMENT 而不是 ASPNETCORE_ENVIRONMENT 是使用 Worker Service Template in .NET 6.0 的问题
    • 如何为控制台应用添加 launchSettings.json,而不是 ASP.NET Core 应用?
    • @SimonTewsi。看看this onethis
    • 为了回答我自己的问题,我发现如果我像 Gary Chan 的回答 stackoverflow.com/a/65804375/216440 那样通过项目属性对话框添加环境变量,它将自动添加一个 launchSettings.json 文件在项目属性文件夹中。然后将在 launchSettings.json 文件中定义环境变量。为避免混淆,通过项目属性对话框设置环境有两种方法:通过命令行参数或通过环境变量。我这里专门说环境变量。
    【解决方案5】:

    另一种方法是直接在主机生成器上使用“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>();
                    });
    

    【讨论】:

    • 请勿发布代码图片。将代码作为文本发布在代码块中。
    • 根据@JérémieLeclercq 的评论,您可以通过将以下内容传递给 UseEnvironment() 来插入您的环境变量:“Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")”
    【解决方案6】:

    如果您使用的是 Visual Studio,并且您有项目配置(Debug、Release、CustomUser...) 那么你可以像这样包含 appsettings.[config-name].json :

    Host
      .CreateDefaultBuilder(args)
      .ConfigureAppConfiguration((context, builder) => {
         //add visual studio configuration manager
         builder.AddJsonFile($"appSettings.{Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyConfigurationAttribute>().Configuration}.json", true);
         ...
       })
        ...
    

    【讨论】:

      【解决方案7】:

      要从环境变量中获取宿主环境,还可以添加:

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

      然后使用Environment环境变量传递实际环境。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-27
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        相关资源
        最近更新 更多