在ASP.NET Core中的Program.Main中访问环境名称

Mik*_*unn 51 c# kestrel asp.net-core

使用ASP.NET Mvc Core我需要将我的开发环境设置为使用https,因此我将以下内容添加到MainProgram.cs中的方法:

var host = new WebHostBuilder()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseKestrel(cfg => cfg.UseHttps("ssl-dev.pfx", "Password"))
                .UseUrls("https://localhost:5000")
                .UseApplicationInsights()
                .Build();
                host.Run();
Run Code Online (Sandbox Code Playgroud)

如何在此处访问托管环境,以便我可以有条件地设置协议/端口号/证书?

理想情况下,我会使用CLI来操纵我的托管环境,如下所示:

dotnet run --server.urls https://localhost:5000 --cert ssl-dev.pfx password
Run Code Online (Sandbox Code Playgroud)

但似乎没有办法从命令行使用证书.

Hen*_*ema 104

我认为最简单的解决方案是从ASPNETCORE_ENVIRONMENT环境变量中读取值并将其与EnvironmentName.Development以下内容进行比较:

var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var isDevelopment = environment == EnvironmentName.Development;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在 .NET Core 3.0+ 中,`EnvironmentName` 类被标记为已过时 (https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.environmentname?view=dotnet-plat -ext-3.1),建议您切换到“Environments”类(https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.environments?view=dotnet-plat-分机-3.1)。 (16认同)
  • 仅当环境由环境变量设置时才有效。例如,也可以使用“--environment“Development””从命令行进行设置 (6认同)
  • 我忘记了 System.Environment。谢谢! (2认同)

Ham*_*edH 16

这是我的解决方案(为ASP.NET Core 2.1编写):

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        var hostingEnvironment = services.GetService<IHostingEnvironment>();

        if (!hostingEnvironment.IsProduction())
           SeedData.Initialize();
    }

    host.Run();
}
Run Code Online (Sandbox Code Playgroud)

  • 这样做的问题是它创建了一个完整的应用程序实例并再次销毁它以获取环境名称.非常沉重的. (7认同)
  • @steed 考虑到这是获取 IHostingEnvironment 的一种干净方式,并且它只在 Run() 之前完成一次,如果它有点“笨手笨脚”,我会说它是可以忽略的。 (3认同)
  • `IHostingEnvironment` 已被弃用,可以替换为 `Microsoft.AspNetCore.Hosting.IWebHostEnvironment` 或 `Microsoft.Extensions.Hosting.IHostEnvironment` (3认同)
  • 在调用 Web 主机构建器 Build 之前需要访问它 (2认同)
  • @Steed util,您不会调用 Run,如 CreateHostBuilder(args).Build().Run() 中所示,您并没有真正创建应用程序的整个实例,您只是创建了主机,并请求了 IHostingEnvironment 的实例 (2认同)
  • 不确定以前的版本,但在.NET7中,只要我调用CreateBuilder,我似乎就可以访问builder.Environment.EnvironmentName。这是在调用 builder.Build() 之前。 (2认同)

Mos*_*hua 6

在 .NET 核心 3.0 中

using System;
using Microsoft.Extensions.Hosting;
Run Code Online (Sandbox Code Playgroud)

然后

var isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == Environments.Development;
Run Code Online (Sandbox Code Playgroud)