如何在同一台机器上配置多个ASPNETCORE_ENVIRONMENT?

How to configure multiple ASPNETCORE_ENVIRONMENT on same machine?

我有 ASP.NET 核心网络应用程序。我已经在我们的 Web 服务器上配置了 Web 应用程序并将 ASPNETCORE_ENVIRONMENT 变量设置为 Development。我在机器级别设置了这个变量,如下图所示。 现在在同一台机器上,我想再配置一个与 Staging 环境相同的 Web 应用程序实例。

在应用程序级别而不是机器级别设置 ASPNETCORE_ENVIRONMENT 我有哪些选择?所以我可以在同一台机器上托管同一应用程序的多个实例?

你有几个选择。

  1. 运行 每个应用程序作为不同的用户,并在该用户配置文件中设置环境变量。这给你一个很好的附加安全奖励。您必须设置应用程序池以加载用户配置文件。

  2. 使用 IIS 配置

    1. 启动 IIS 管理器
    2. 选择配置编辑器下拉部分 组合框并选择系统。webServer/aspNetCore
    3. 下拉从 组合框并选择 Applicationhost.config
    4. 点击 environmentVariables 元素并单击隐藏在中的 ... 按钮 第二列,在右边。
    5. 设置您的环境变量。
    6. 退出环境变量屏幕,然后单击应用。
    7. 重新启动应用程序 pool/app。

您可以更改 Web 服务器上的代码解析配置 运行ning 吗?这就是我建议做的。这将允许您在 Windows 设置中更自然地配置您的环境。

虽然配置 IHostingEnvironment.EnvironmentName 变量的传统方法是通过 ASPNETCORE_ENVIRONMENT 环境变量,但您可以更改 ASP.NET Core 解析其配置的方式,这样您就可以通过命令行参数设置变量。

具体细节...

默认情况下,dotnet new -t web 命令生成的 Program.cs 文件类似于以下内容:

public static void Main(string[] args) {
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseUrls("http://0.0.0.0:5000")
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}

这使得 ASP.NET 核心使用 the default configuration processing (environment variables with a ASPNETCORE_ prefix) 来确定 IHostingEnvironment.EnvironmentName 的值,您正在使用它来配置您的应用程序 运行s.

幸运的是,您可以使用 UseConfiguration() extension method on WebHostBuilder 改变 ASP.NET 核心解析配置的方式。下面是使用默认实现的自定义配置的示例:

    public static void Main(string[] args) {
        var configuration =
            new ConfigurationBuilder()
                .AddEnvironmentVariables("ASPNETCORE_")
                .Build();

        var host =
            new WebHostBuilder()
                .UseConfiguration(configuration)
                .UseKestrel()
                .UseUrls("http://0.0.0.0:5000")
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

        host.Run();
    }

从这里开始,我将对其进行更改,以便除了 ASPNETCORE_ 前缀环境变量之外它还可以使用命令行。这将允许您轻松地 运行 您的应用程序使用您想要的任何环境名称,如下所示:

    public static void Main(string[] args) {
        var configuration =
            new ConfigurationBuilder()
                .AddEnvironmentVariables("ASPNETCORE_")
                .AddCommandLine(args)
                .Build();

        var host =
            new WebHostBuilder()
                .UseConfiguration(configuration)
                .UseKestrel()
                .UseUrls("http://0.0.0.0:5000")
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

        host.Run();
    }

然后,当您使用 dotnet run 启动您的 dotnet 核心应用程序时,您可以在命令行上设置环境,如下所示:

dotnet run environment=development
dotnet run environment=staging

现在 ASPNETCORE_ENVIRONMENT 环境变量仍然有效,但您可以在进行本地开发时通过命令行覆盖它。请注意,您需要将 Microsoft.Extensions.Configuration.CommandLine nuget 包包含到您的 project.json 文件中,如果您尚未这样做以获得 AddCommandLine() 扩展方法。