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

bit*_*ift 18 c# .net-core

我正在将一个 .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>();
                });
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Gar*_*han 34

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

Visual Studio 2019 图像

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

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

  • 我认为可以通过添加一点代码来改进答案: .ConfigureHostConfiguration(configHost =&gt; { configHost.AddEnvironmentVariables(prefix: "DOTNET_"); } (9认同)
  • @RobJohnston 您的评论实际上是此页面上唯一真正为我回答这个问题的内容。 (3认同)

pfx*_*pfx 24

您可以通过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();
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio 中,您可以使用与dotnet runwhich is使用的参数相同的参数来配置应用程序参数--environment
例如dotnet run --environment Test.

如果没有此应用程序参数,托管环境将默认返回Production.

在此处输入图片说明

  • 我偶然发现了很多可能的答案,这些答案让我感到畏缩。我很高兴我找到了这个。它有效并且不依赖环境变量或 ASP.NET Core,所以我绝对是最佳答案。 (2认同)

Viv*_*Dev 16

如果您将 Visual Studio 2022 与 .Net 5 及更高版本一起使用,则 UI 可能会有点让人不知所措。编辑属性下的 launchSettings.json 文件很简单。

属性下的启动设置

我的看起来如下。请注意它DOTNET_ENVIRONMENT不适 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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,在启动项目时选择您想要的配置文件。下面显示了所有内容以及 Program.cs。

在 Visual Studio 2022 中选择启动配置文件

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

    - 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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!使用通用主机 (HostBuilder) 的 .NET Core 控制台应用程序的 **DOTNET_ENVIRONMENT** 而不是 **ASPNETCORE_ENVIRONMENT** 是使用 [.NET 6.0 中的辅助服务模板](https://learn.microsoft. com/en-us/dotnet/core/extensions/workers) (6认同)
  • 谢谢 !!!当我在作为托管服务应用程序的控制台应用程序中将 ***ASPNETCORE_ENVIRONMENT*** 更改为 ***DOTNET_ENVIRONMENT*** 时,选择了正确的环境。 (2认同)

Jér*_*rcq 11

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

https://learn.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>();
                });
Run Code Online (Sandbox Code Playgroud)

  • 请不要发布代码图像。将代码作为文本发布到代码块中。 (3认同)

use*_*699 11

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

在此输入图像描述

或设置环境变量:

在此输入图像描述

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

在此输入图像描述