为 dotnetcore Windows 服务设置环境变量——仅限进程,而不是系统或用户

Ros*_*ser 8 configuration .net-core

我们的开发人员正在 .NET Core 3.1 中编写一些 Windows 服务。

据我了解,核心开发的典型模式是检查 DOTNET_ENVIRONMENT 变量以切换不同的配置。

由于 Reasons TM,我们希望避免设置系统级甚至用户级机器环境变量。一些原因是:

  • 推出新服务器时需要设置的其他内容
  • 可能想在同一台服务器上运行不同的“环境”——也许不是为了服务,而是为了其他命令行应用程序

对于 IIS 启动的 Kestrel 托管应用程序,可以在 web.config 中设置额外的环境值。这不适用于命令行应用程序。

对此的最佳实践是什么?有没有办法在启动可执行文件之前设置环境变量?或者在启动时通过从配置文件中读取环境变量来设置进程内的环境变量?

其他需要提及的事情:

Mar*_*k G 13

环境变量配置提供程序下的文档中包含以下摘录:

默认配置加载以 . 为前缀的环境变量和命令行参数DOTNET_DOTNET_.NET 使用该前缀进行主机应用程序配置,但不用于用户配置。

因此,如果您使用命令行参数,--environment Development则应将其转换为DOTNET_ENVIRONMENT=Development. 经过测试,它与 .NET 5.0 辅助服务一起使用。

  • 请注意这一点 - 这可以 100% 工作,但只有在您使用“dotnet”实际运行工作程序时才有效。如果您构建一个可以在没有“dotnet”命令的情况下运行的自包含 exe,则需要找到另一种方法。对我来说,我最终所做的只是将参数 `EnvironmentName` 传递给 exe,并从 args 中使用它来获取环境(即 `WorkerService.exe Uat`) (3认同)
  • @NewteqDeveloper 不正确,即使在 exe 中也能工作,只要将命令行参数传递给 CreateDefaultBuilder: `IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)` (2认同)
  • @Bohdan啊,我没有意识到那一步。那是失踪了。我认为重要的是要记住,如果您需要在同一服务器上运行多个 dotnet 应用程序,则使用变量作为“exe”的输入会有所帮助。 (2认同)