【问题标题】:Access environment name in Program.Main in ASP.NET CoreASP.NET Core 中 Program.Main 中的访问环境名称
【发布时间】:2020-11-23 08:38:39
【问题描述】:

使用 ASP.NET Mvc Core 我需要将我的开发环境设置为使用 https,所以我在 Program.cs 中的 Main 方法中添加了以下内容:

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();

这里如何访问托管环境,以便有条件地设置协议/端口号/证书?

理想情况下,我会像这样使用 CLI 来操作我的托管环境:

dotnet run --server.urls https://localhost:5000 --cert ssl-dev.pfx password

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

【问题讨论】:

    标签: c# asp.net-core kestrel


    【解决方案1】:

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

    var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    var isDevelopment = environment == Environments.Development;
    

    【讨论】:

    • 我忘记了 System.Environment。谢谢!
    • 请注意,在 .NET Core 3.0+ 中,EnvironmentName 类被标记为过时 (docs.microsoft.com/en-us/dotnet/api/…),建议您切换到 Environments 类 (docs.microsoft.com/en-us/dotnet/api/…)。
    • 这仅在环境由环境变量设置时有效。也可以在命令行中使用--environment "Development" 进行设置,例如
    • 如果你根本不使用 asp.net,你会怎么做?就像它只是一个控制台应用程序一样?
    【解决方案2】:

    这是我的解决方案(为 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();
    }
    

    【讨论】:

    • 这个问题是它创建了应用程序的整个实例并再次销毁它只是为了获取环境名称。非常沉重。
    • @steed 考虑到这是一种获得 IHostingEnvironment 的干净方法,并且它只在 Run() 之前完成一次,如果它有点“笨拙”,我会说它是可以忽略的。
    • 在调用 web 主机生成器 Build 之前需要访问它
    • @Steed util 您不调用 Run,就像在 CreateHostBuilder(args).Build().Run() 中一样,您并没有真正创建应用程序的整个实例,您只是创建了主机,并请求一个 IHostingEnvironment 实例
    • IHostingEnvironment 已被弃用,可以替换为 Microsoft.AspNetCore.Hosting.IWebHostEnvironmentMicrosoft.Extensions.Hosting.IHostEnvironment
    【解决方案3】:

    在 .NET 核心 3.0 中

    using System;
    using Microsoft.Extensions.Hosting;
    

    然后

    var isDevelopment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == Environments.Development;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      相关资源
      最近更新 更多