为 dotnetcore Windows 服务设置环境变量——仅限进程,而不是系统或用户
Setting environment variables for dotnetcore Windows service -- process only, not system or user
我们的开发人员正在 .NET Core 3.1 中编写一些 Windows 服务。
据我了解,Core 开发的典型模式是检查 DOTNET_ENVIRONMENT 变量以开启不同的配置。
出于TM的原因,我们希望避免设置系统级甚至用户级机器环境变量。其中一些原因是:
- 推出新服务器时需要设置的其他内容
- 可能想要 运行 同一台服务器上的不同“环境”——可能不是为了服务,而是为了其他命令行应用程序
对于由 IIS 启动的 Kestrel 托管应用程序,可以在 web.config 中设置额外的环境值。这不适用于命令行应用程序。
这方面的最佳做法是什么?有没有办法在启动可执行文件之前设置环境变量?或者在启动时通过从配置文件中读取环境变量来在进程中设置环境变量?
其他要提及的事项:
- 当我们开始容器化时,设置容器级别的环境变量显然是可行的方法,但对于像这样的共享 Windows 服务器(实际上是 VM),我们需要不同的方法。
- 我们已审核 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1 。即使它针对 ASP.NET Core 而不是 console/service Core 中的应用程序。
我已经确定了这个答案:在所有情况下,启动的 .NET 核心应用程序默认情况下不会查看任何配置文件来设置环境变量。因此,要么代码必须通过添加代码来设置自己的环境变量,要么需要包装器应用程序在生成应用程序之前设置这些变量。
隐藏在 Environment variable configuration provider 下的文档中的是以下摘录:
The default configuration loads environment variables and command-line arguments prefixed with DOTNET_
. The DOTNET_
prefix is used by .NET for host and app configuration, but not for user configuration.
因此,如果您使用命令行参数 --environment Development
,它应该被转换为 DOTNET_ENVIRONMENT=Development
。这已经过测试,可用于 .NET 5.0 辅助角色服务。
我们的开发人员正在 .NET Core 3.1 中编写一些 Windows 服务。
据我了解,Core 开发的典型模式是检查 DOTNET_ENVIRONMENT 变量以开启不同的配置。
出于TM的原因,我们希望避免设置系统级甚至用户级机器环境变量。其中一些原因是:
- 推出新服务器时需要设置的其他内容
- 可能想要 运行 同一台服务器上的不同“环境”——可能不是为了服务,而是为了其他命令行应用程序
对于由 IIS 启动的 Kestrel 托管应用程序,可以在 web.config 中设置额外的环境值。这不适用于命令行应用程序。
这方面的最佳做法是什么?有没有办法在启动可执行文件之前设置环境变量?或者在启动时通过从配置文件中读取环境变量来在进程中设置环境变量?
其他要提及的事项:
- 当我们开始容器化时,设置容器级别的环境变量显然是可行的方法,但对于像这样的共享 Windows 服务器(实际上是 VM),我们需要不同的方法。
- 我们已审核 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1 。即使它针对 ASP.NET Core 而不是 console/service Core 中的应用程序。
我已经确定了这个答案:在所有情况下,启动的 .NET 核心应用程序默认情况下不会查看任何配置文件来设置环境变量。因此,要么代码必须通过添加代码来设置自己的环境变量,要么需要包装器应用程序在生成应用程序之前设置这些变量。
隐藏在 Environment variable configuration provider 下的文档中的是以下摘录:
The default configuration loads environment variables and command-line arguments prefixed with
DOTNET_
. TheDOTNET_
prefix is used by .NET for host and app configuration, but not for user configuration.
因此,如果您使用命令行参数 --environment Development
,它应该被转换为 DOTNET_ENVIRONMENT=Development
。这已经过测试,可用于 .NET 5.0 辅助角色服务。