ChatGPT解决这个技术问题 Extra ChatGPT

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

使用 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

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


P
Pang

我认为最简单的解决方案是从 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,你会怎么做?就像它只是一个控制台应用程序一样?
F
Felix K.

这是我的解决方案(为 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
M
Moses Machua

在 .NET 核心 3.0 中

using System;
using Microsoft.Extensions.Hosting;

然后

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