在 ASP.NET Core 3.1 中的 Program.cs Web 主机生成器中使用 IWebHostEnvironment

Dim*_*rov 9 c# asp.net-core

我有一个ASP.NET 3.1的核心应用程序,我需要访问IWebHostEnvironmentProgram.cs虚拟主机制造商。这就是我现在所拥有的(Program.cs):

public class Program {

    public static void Main(string[] args) {
        CreateWebHostBuilder(args).Build().Run();
    }

    private static bool IsDevelopment => 
        Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";

    public static string HostPort => 
        IsDevelopment 
            ? "5000" 
            : Environment.GetEnvironmentVariable("PORT");

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseUrls($"http://+:{HostPort}")
            .UseSerilog((context, config) => {
                config.ReadFrom.Configuration(context.Configuration);
            })
            .UseStartup<Startup>();
}
Run Code Online (Sandbox Code Playgroud)

IsDevelopment我不想按照我的方式进行检查,而是想使用IsDevelopment()from的方法IWebHostEnvironment,但不完全确定如何执行此操作。我现在拥有的东西有效,但老实说它“感觉不对”。

Jes*_*ess 11

在 .NET 6 中,您可以使用新的最小托管模型

在主程序中,您可以创建应用程序生成器和应用程序。(Environment作为IWebHostEnvironment) 在两个对象上都可用。

例如在Program.cs

var builder = WebApplication.CreateBuilder(args);
var environment = builder.Environment;
Run Code Online (Sandbox Code Playgroud)

或者:

var app = builder.Build();
var environment = app.Environment;
Run Code Online (Sandbox Code Playgroud)

您可能希望将环境传递给ConfigureServices,如下所示:

var startup = new Startup(builder.Configuration);
startup.ConfigureServices(builder.Services, builder.Environment);
Run Code Online (Sandbox Code Playgroud)

(PS:我不认为这段代码依赖于使用最小托管模型,但这使它更简单。我认为环境属性也可以返回到.NET 3.1,这是最初的问题。)


Zin*_*nov 4

如果你想使用你应该从上下文参数中IWebHostingEnvironment获取它ConfigureAppConfiguration

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context, builder) =>
                {
                    var isDev = context.HostingEnvironment.IsDevelopment();
                    var isProd = context.HostingEnvironment.IsProduction();
                    var envName = context.HostingEnvironment.EnvironmentName;
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
Run Code Online (Sandbox Code Playgroud)