我有一个自托管的.NET Core 2.2控制台应用程序,该应用程序不使用Web主机生成器,因为我不需要此服务的HTTP端点。
我正在尝试通过托管环境的(defmulti depth adt-type)
(defmethod depth Empty [_] 0)
(defmethod depth Leaf [_] 1)
(defmethod depth Node [node]
(+ 1 (max (depth (node :left)) (depth (node :right)))))
(defmethod depth :default [_] 0)
方法来利用环境变量,但是它总是以 Production 的形式返回。
以下是我设置主机生成器的方式。我有一个名为php_flag display_errors off
的环境变量,其值为 Development (开发),这使我提出了两个问题。
IsDevelopment()
以外的其他环境变量?我意识到我可能可以在构建ASPNETCORE_ENVIRONMENT
之前编写代码,该{明确地寻找环境变量并手动设置环境,但是ASP.NET Core似乎将其隐藏在幕后,所以我想看看如果我不使用Web Host Builder时是否有办法得到类似的行为。
ASPNETCORE_ENVIRONMENT
更新:在配置应用程序之前,需要执行以下操作来配置主机
HostBuilder
这是在.ConfigureAppConfiguration()之前调用的,并且是从任何名为“ Environment”的变量加载的,这意味着我不必使用ASPNET_ENVIRONMENT。
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.2
答案 0 :(得分:1)
在构建自己的主机时进行设置的正确方法是什么,以便在构建主机时可以有条件地向配置中添加用户密码?
正确的方法是不使用BuildEngineHost
方法中当前拥有的所有代码行。如果您使用的是ASP.Net Core 2.2,则已经为您设置了编写的那些设置。在您的Program.cs
文件中,您应该拥有以下内容:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
当您查看GitHub上的CreateDefaultBuilder
方法实现时,您会发现默认情况下您要执行的操作已经完成。这是CreateDefaultBuilder
的实现:
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
var builder = new WebHostBuilder();
if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey)))
{
builder.UseContentRoot(Directory.GetCurrentDirectory());
}
if (args != null)
{
builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());
}
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment())
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
}).
UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
});
ConfigureWebDefaults(builder);
return builder;
}
无论如何,如果您不想使用此实现以便回答第二个问题,则需要使用添加以下行:
config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
此行之后:
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
env
变量是一种类型IHostingEnvironment
,需要注入您的BuildEngineHost
方法中。
答案 1 :(得分:0)
我能够通过在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();
}