c# - 在自托管的 .net core 2.2 应用程序上正确使用 IsDevelopement()
问题描述
我有一个自托管的 .NET core 2.2 控制台应用程序,它不使用 Web 主机生成器,因为我不需要此服务的 HTTP 端点。
我试图通过IsDevelopment()
托管环境的方法来利用环境变量,但它总是以Production的形式返回。
以下是我设置主机构建器的方式。我有一个名为DevelopmentASPNETCORE_ENVIRONMENT
的环境变量,这让我问了两个问题。
- 在构建我自己的主机时设置此设置的正确方法是什么,以便我可以在构建主机时有条件地将用户机密添加到我的配置中?
- 第二个问题是我是否可以使用其他环境变量,
ASPNETCORE_ENVIRONMENT
因为我的应用程序不是 ASP.NET 核心应用程序?
我意识到我可能会在构建HostBuilder
显式查找环境变量并手动设置环境之前编写代码,但是 ASP.NET Core 似乎在幕后挂钩,所以我想看看是否有办法获得当我不使用网络主机生成器时,类似的行为。
private static IHost BuildEngineHost(string[] args)
{
var engineBuilder = new HostBuilder()
.ConfigureAppConfiguration((hostContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
config.AddEnvironmentVariables();
if(hostContext.HostingEnvironment.IsDevelopment())
config.AddUserSecrets<EngineOptions>();
})
.ConfigureServices((hostContext, services) =>
{
services.Configure<EngineOptions>(hostContext.Configuration.GetSection("EngineOptions"));
services.AddHostedService<EtlEngineService>();
})
.ConfigureLogging((hostContext, logging) =>
{
logging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
logging.AddConsole();
});
return engineBuilder.Build();
}
更新:在配置应用程序之前需要配置主机
.ConfigureHostConfiguration(config =>
{
config.AddCommandLine(args);
config.AddEnvironmentVariables();
})
这在 .ConfigureAppConfiguration() 之前调用,并从任何名为“Environment”的变量加载,这意味着我不必使用 ASPNET_ENVIRONMENT。
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.2
解决方案
我能够通过在 AppConfiguration 之前调用 ConfigureHostConfiguration() 来使用正确的值初始化托管环境,这可以正确设置主机中的环境值,这是我在 Microsoft 的以下文档中遇到的。
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.2
private static IHost BuildEngineHost(string[] args)
{
var engineBuilder = new HostBuilder()
.ConfigureHostConfiguration(config =>
{
config.AddEnvironmentVariables();
config.AddCommandLine(args);
})
.ConfigureAppConfiguration((hostContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
config.AddEnvironmentVariables();
if(hostContext.HostingEnvironment.IsDevelopment())
config.AddUserSecrets<EngineOptions>();
})
.ConfigureServices((hostContext, services) =>
{
services.Configure<EngineOptions>(hostContext.Configuration.GetSection("EngineOptions"));
services.AddHostedService<EtlEngineService>();
})
.ConfigureLogging((hostContext, logging) =>
{
logging.AddConfiguration(hostContext.Configuration.GetSection("Logging"));
logging.AddConsole();
});
return engineBuilder.Build();
}
推荐阅读
- python - 使用 Python 加速具有高内存需求的并行处理的最有效方法是什么?
- mysql - 在 sql 作业中带有代理帐户的 ssis 包
- javascript - 使对象 3d 查看其他向量,但在 Three.js 中冻结 z 轴
- jquery - 一段时间后隐藏和显示
- javascript - 为什么没有触发 img 的 onload 事件?
- reactjs - 如何将一个 React 功能组件绑定到另一个?(DevExtreme Chart 到 PivotGrid)
- node.js - 如何使用 fs.writeFile 将图像正确保存到文件系统?
- c++ - C++ 在循环内使用 getline() 读取 CSV 文件
- python - 列表中浮点数的总和相差 0.00000001
- swift - 如何在插入行之前向 UITableViewCells 添加标签?