如何从 ASP.NET Core 的 Main() 中获取环境变量?

Posted

技术标签:

【中文标题】如何从 ASP.NET Core 的 Main() 中获取环境变量?【英文标题】:How to get environment variables from inside Main() in ASP.NET Core? 【发布时间】:2020-06-26 18:56:18 【问题描述】:

我想知道代码是否是 Dev/Stage,所以我需要得到它。我尝试了下面的代码,但它似乎跳过了运行 Startup.cs 的 Configure()。帮忙?

 public static void Main(string[] args)
        
            IHost host = CreateHostBuilder(args).Build();

            SeedDatabase(host);

            host.Run();
        

        public static IHostBuilder CreateHostBuilder(string[] args)
        


            //return Host.CreateDefaultBuilder(args)
            //  .ConfigureWebHostDefaults(webBuilder =>
            //  
            //      webBuilder.UseStartup<Startup>();
            //  );




            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                
                    webBuilder.UseStartup<Startup>();

                    webBuilder.ConfigureServices(services =>  )
                    .Configure(app =>
                    
                        Env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
                    );
                );
        

【问题讨论】:

***.com/questions/32548948/… toralux 的回答在 main() 中获取环境 【参考方案1】:

您还没有完全解释您要获取的内容(环境变量或环境对象)。但根据问题中的一些代码,您似乎想访问IWebHostEnvironment

这很容易。 IHost 有一个 Services 属性。您只需要请求相应的服务即可。

IHost host = CreateHostBuilder(args).Build();
IWebHostEnvironment env = host.Services.GetRequiredService<IWebHostEnvironment>();
// now do something with env
SeedDatabase(host);
host.Run();

现在,如果您首先需要环境,您还可以从different overload 的ConfigureServices 内部的WebHostBuilderContext 访问环境:

webBuilder.ConfigureServices((ctx, services) =>  
   IWebHostEnvironment env = ctx.HostingEnvironment;
   // Do something with env
);

同样,IHostBuilder(通用主机)上的ConfigureAppConfigurationConfigureHostConfigurationConfigureServices 也提供对IHostEnvironment 的访问(注意缺少“Web”):

return Host.CreateDefaultBuilder(args)
   .ConfigureAppConfiguration((ctx, config) => 
      IHostEnvironment env = ctx.HostingEnvironment;
   )
   .ConfigureServices((ctx, services) => 
      IHostEnvironment env = ctx.HostingEnvironment;
   )
   .ConfigureWebHostDefaults(/* etc */ );

通用主机和网络主机使用相同的服务集合、环境等(除了添加的IWebHostEnvironment

旁注:通常在第一次调用您的应用程序之前不会调用 Startup.cs。这可能就是它似乎没有运行的原因。

【讨论】:

【参考方案2】:

尝试从您的 main 方法中获取它,如下所示:

static void Main(string[] args)

  var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

【讨论】:

以上是关于如何从 ASP.NET Core 的 Main() 中获取环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何从控制器告诉 ASP.NET Core 视图存在?

如何从 ASP.NET MVC 到 ASP.NET Core Web API 的 PUT?

如何从 ASP.NET Core WebAPI 获取 int 值?

ASP.NET Core 进程内(InProcess)托管

如何使用剃刀视图 ASP .Net Core 从 JWT 声明角色

使用命令行如何在 ASP.NET 中首先从 DB 搭建脚手架 - 而不是 ASP.NET Core MVC?